How to run webdriver(Java) on Firefox 47.0 32bit

色々な文献を照会して試行錯誤した結果、

Firefox47.0をseleniumで動作させることが確認できました。

 

その方法を以下の通り共有します。

 

プログラム

prop.xml (プロパティファイル)

<entry key="geckoDriverPath">C:\Program Files (x86)\geckodriver-v0.8.0-win32\wires.exe</entry>
<entry key="wiresPath">C:\Program Files (x86)\wires-v0.7.1-win32\wires.exe</entry>

<entry key="32bitFFPath">C:\Program Files (x86)\Mozilla Firefox\firefox.exe</entry>
<entry key="FFDevPath">C:\Program Files (x86)\Firefox Developer Edition\firefox.exe</entry>
<entry key="NightlyPath">C:\Program Files (x86)\Nightly\firefox.exe</entry>
<entry key="64bitFFPath">C:\Program Files\Mozilla Firefox\firefox.exe</entry>

 

Driver.java (Firefoxドライバを生成メソッドを定義したクラス)

public static WebDriver createFireFoxWebDriver() {

	// https://id:pw@url/でアクセス可能なFireFox用Profileを生成・ロードする
	ProfilesIni profile = new ProfilesIni();
	FirefoxProfile myprofile = profile.getProfile("SeleniumProfile");

	// geckoDriverではなく、wires.exeをwebdriver.gecko.driverとして指定する
	// System.setProperty("webdriver.gecko.driver", Props.hmProp.get("geckoDriverPath"));
	System.setProperty("webdriver.gecko.driver", Props.hmProp.get("wiresPath"));

	// プロファイルをセットする
	DesiredCapabilities capabilities = DesiredCapabilities.firefox();
	capabilities.setCapability(FirefoxDriver.PROFILE, myprofile);

	capabilities.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
	capabilities.setJavascriptEnabled(true);

	// marionetteをtrueにする
	capabilities.setCapability("marionette", true);

	// 32bit版FireFox v47.0を指定する
	capabilities.setCapability("binary", Props.hmProp.get("32bitFFPath"));
	// capabilities.setCapability("binary", Props.hmProp.get("FFDevPath"));
	// capabilities.setCapability("binary", Props.hmProp.get("NightlyPath"));
	// capabilities.setCapability("binary", Props.hmProp.get("64bitFFPath"));

	// (個人的な取り組み)でBasic認証を乗り越える設定を施す(プロファイルに設定しないときはコメントを外す→外してもダメだった。プロファイルに設定するのが無難)
	// capabilities.setCapability("browser.safebrowsing.malware.enabled", false);

	// capabilitiesにプロファイルを指定してドライバを生成する
	driver = new MarionetteDriver(capabilities);

	return driver;
}

 

このような形で@Testを実行したところ、Firefox 47.0 32bit版(≠Developer Edition)を起動することが出来ました。

 

以下は起動したFirefoxトラブルシューティング情報です。

 

アプリケーション基本情報

名前: Firefox
バージョン: 47.0
ビルド ID: 20160604131506
更新チャンネル: release
ユーザエージェント: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0
OS: Windows_NT 6.1 x86
マルチプロセスウィンドウ: 0/1 (無効)
セーフモード: false

 

実行したテスト

試しに以下の簡単な処理を実行しました。実行できたseleniumメソッドの報告が目的なので、体裁は無視してます。

@BeforeMethod
createFireFoxWebDriver(); //上記Driver.java記載の処理
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get(url); // Basic認証が必要なサイトへリクエスト送信する
driver.manage().window().maximize();

@Test
PageObject TopPage = PageFactory.initElements(driver, PageObject.class);
portalTopPage.web_element.click();

@AfterMethod
driver.quit();

 

注意点

http://qiita.com/yssg/items/a054d67bc7c7fc39b276?utm_source=dlvr.it&utm_medium=twitter

こちらで紹介されていた「導入手順#2.GeckoDriverをwires.exeにリネーム」が上記の場合、うまくいきませんでした。(Firefoxが起動しませんでした)

 

そこで「geckodriver-v0.8.0-win32」ではなく、「wires-v0.7.1-win32」を利用したところ、うまくいきました。

これは https://github.com/seleniumhq/selenium/issues/1431 ここで

@AutomatedTester(David Burnsさん)がコメントされていた「Was this using the latest wires release?」というコメントをヒントにしました。

 

上記に至るまでに試したこと。

  1. FirefoxプロファイルをロードせずにgeckoDriverでブラウザを起動する 非Basic認証サイトなら ◯
  2. geckoDriver+Nightlyを使う
  3. geckoDriver+Developer Editionを使う

Testを停止後、Firefoxが起動してテストケースが走るという意味不明な動作をしました。

No.2,3は47.0が起動してしまいました。

 

以上、少しでも参考になれば幸いです。