daybreaksnow's diary

私を私と呼びたい

[GWT]Seleniumを同一プロジェクトで動かそうとして諦めた調査ログ

結論としては諦めてGWTSeleniumを別プロジェクトにしてテストを書いた。
[GWT]Seleniumで非同期処理のテストを行う - daybreaksnow's diary


GWT(2.4)のプロジェクトに最新のSelenium(selenium-java-2.35.0.jar、selenium-server-standalone-2.35.0.jar)のビルドパスを通し、FireFoxDriverをnewした際のエラー

java.lang.NoSuchMethodError: org.apache.http.conn.scheme.Scheme.(Ljava/lang/String;ILorg/apache/http/conn/scheme/SchemeSocketFactory;)V
	at org.openqa.selenium.remote.internal.HttpClientFactory.getClientConnectionManager(HttpClientFactory.java:59)
	at org.openqa.selenium.remote.internal.HttpClientFactory.(HttpClientFactory.java:48)
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:100)
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:81)
	at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.start(NewProfileExtensionConnection.java:81)
	at org.openqa.selenium.firefox.FirefoxDriver.startClient(FirefoxDriver.java:251)
	at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:110)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:197)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:190)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:186)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:99)
	at com.google.gwt.sample.stockwatcher.client.SeleniumTest.setUp(fSeleniumTest.java:44)
	at junit.framework.TestCase.runBare(TestCase.java:128)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

これはgwt-dev.jarとSelenium-serverでSchemeクラスが競合していることが原因。
参考URL:java - NoSuchMethodError: org.apache.http.conn.scheme.Scheme.<init>(Ljava/lang/String;ILorg/apache/http/conn/scheme/SchemeSocketFactory;)V - Stack Overflow

それぞれのjar内のhttpclientのversion.propertiesを見ると、以下のように異なっている。

gwt-dev(GWT2.4) : 4.0.1
selenium-server-2.35.0 : 4.2.1

対策としては、mavenを使ってpomでバージョンを指定すればよいらしい(直感的にはできなそうだが…)。
参考URL:java - gwt-dev includes httpclient 4.0 how do I get around that in a maven env? - Stack Overflow

しかし、今のプロジェクトはantを使ってビルド管理をしているので、ここでテストのためだけにmavenを使うと面倒。
GWT2.4と同じhttpclientのバージョンのselenium-serverがないか探した。


seleniumリポジトリをgit cloneで落としてきて、以下のディレクトリでログを確認

cd selenium\third_party\java\apache-httpclient
git log .


以下のコミットログが見つかった。

commit 0a2e1e24c81946bca51e13314409eaa2bcbab31f
Author: Paul Hammant 
Date:   Thu Sep 30 22:17:05 2010 +0000

    upgrade to 4.0.2 HttpClient from Apache, throughout this time

    r9779

diffを確認

 git diff  "0a2e1e24c81"^^...0a2e1e24c81 .

このリビジョンより前なら4.0.1であることを確認

 -"httpclient-4.0.1.jar",
 +"httpclient-4.0.2.jar",

以下から2010/9/30以前のリリースを探した

https://code.google.com/p/selenium/downloads/list?can=4&q=selenium-server&colspec=Filename%20Summary%20Uploaded%20ReleaseDate%20Size%20DownloadCount&num=100&start=100

結果、2010/Julリリースのselenium-server-2.0a5.zipがあった。
しかし、これはさすがに古すぎるように思えるので、このSeleniumを使うのはあきらめた。

次に、Selenium-clientだけ入れて、httpclient.jarだけ差し替えてみた。
→RedirectStrategyというHttpClient4.1以降のクラスが使われているためダメだった。

java.lang.NoClassDefFoundError: org/apache/http/client/RedirectStrategy
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:100)
	at org.openqa.selenium.remote.HttpCommandExecutor.(HttpCommandExecutor.java:81)
	at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.start(NewProfileExtensionConnection.java:81)
	at org.openqa.selenium.firefox.FirefoxDriver.startClient(FirefoxDriver.java:251)
	at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:110)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:197)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:190)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:186)
	at org.openqa.selenium.firefox.FirefoxDriver.(FirefoxDriver.java:99)
	at com.google.gwt.sample.stockwatcher.client.SeleniumTest3.setUp(SeleniumTest3.java:37)
	at junit.framework.TestCase.runBare(TestCase.java:128)
	at junit.framework.TestResult$1.protect(TestResult.java:106)
	at junit.framework.TestResult.runProtected(TestResult.java:124)
	at junit.framework.TestResult.run(TestResult.java:109)
	at junit.framework.TestCase.run(TestCase.java:120)
	at junit.framework.TestSuite.runTest(TestSuite.java:230)
	at junit.framework.TestSuite.run(TestSuite.java:225)
	at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.apache.http.client.RedirectStrategy
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 23 more

ここで知人にどうにからない?と尋ねたところGWTSeleniumを別VMで動かすしかないんじゃ?と言われたので、同じプロジェクトに入れるのを断念した。