[GWT]Seleniumを同一プロジェクトで動かそうとして諦めた調査ログ
結論としては諦めてGWTとSeleniumを別プロジェクトにしてテストを書いた。
→[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 HammantDate: 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以前のリリースを探した
結果、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
ここで知人にどうにからない?と尋ねたところGWTとSeleniumを別VMで動かすしかないんじゃ?と言われたので、同じプロジェクトに入れるのを断念した。