前回の記事「Selenium3のインストールとEclipseへのセットアップ(Javaからブラウザを自動で操作する)」で、Selenium3の概要と自動化を実現する仕組みの概要、Eclipseプロジェクトの設定方法まで解説しました。
今回は、特にFirefoxの自動化のJavaコードを解説します。
Firefoxの自動化のJavaコード
早速ですが、JavaでFirefoxを自動で起動し、あるサイトにアクセスするには、以下のようにします。
import java.io.File;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.openqa.selenium.remote.DesiredCapabilities;
public class FirefoxDriverSample {
public static void main(String[] args) throws InterruptedException{
String Firefoxdriverpath = "C:\\selenium\\driver\\geckodriver-v0.16.0-win64\\geckodriver.exe";
WebDriver driver;
System.setProperty("webdriver.gecko.driver", Firefoxdriverpath);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability("marionette", true);
//↓↓↓ここから3行はaddonエラーが出る場合に必要だった
String profileDir = "C:\\Users\\xxx\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles\\xxxx.default";
FirefoxProfile fp = new FirefoxProfile(new File(profileDir));
capabilities.setCapability(FirefoxDriver.PROFILE, fp);
//↑↑↑ここまで
driver = new FirefoxDriver(capabilities);
driver.get("http://www.yahoo.co.jp");
Thread.sleep(5000);
driver.quit();
}
}
String Firefoxdriverpath = “C:\\selenium\\driver\\geckodriver-v0.16.0-win64\\geckodriver.exe”;
この行では前回の記事でもダウンロードしたFirefox用のWebDriverのexeへのパスを設定しています。後程、このパスを使って、FirefoxWebDriverを起動します。
System.setProperty(“webdriver.gecko.driver”, Firefoxdriverpath);
Javaの場合、システムプロパティに「webdriver.gecko.driver」というキーでFirefoxWebDriverへのパスを設定することで、WebDriverを起動することができます。
capabilities.setCapability(“marionette”, true);
直前でインスタンス化したDesiredCapabilitiesに設定を行うことで、firefox自動実行時の振る舞いを変えることができます。このコードは「marionette」を有効化しています。最近のFirefoxでは、marionetteという自動化の仕組みを積極的に開発していて、それを使った比較的新しい方法でSeleniumから操作するか、以前の仕組みで操作するかをこの設定で指定できます。trueを渡すとそれが有効になります。
driver = new FirefoxDriver(capabilities);
設定したDesiredCapabilitiesでWebDriverを起動します。後は、「driver.get(“http://www.yahoo.co.jp”);」のように、インスタンス化したdriverに対して自動操作を行っていくことが多いでしょう。
エラーが起きる場合の対処法
ブラウザは、頻繁にアップグレードが行われていますので、自動実行時にもエラーが出やすいです。ここでは、いくつかのエラーとその対処法についてメモしておきます。
WebDriver、言語バインディングは、サポートするFirefoxのバージョンがあります。このバージョンがあっていないと思わぬエラーを引き起こしやすいです。
Firefox用のWebDriverのページの「Supported Firefoxen」セクション等にサポートするFirefoxのバージョンが書いてあったりするので、確認してみましょう。
ネイティブのAPIを呼び出している関数を使っている場合にエラーが出てしまう場合は、OSのbit数とFirefoxのbit数があっているかどうかも確認してみるといいかもしれません。OSは64bitのWindowsなのに、インストールしているFirefoxは32bit版だったりすると、エラーが出る場合があります。
私がはまったのが、以下のようなアドオンのエラーでした。
addons.manager ERROR startup failed: Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIFile.create]"
nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)"
location: "JS frame :: resource://gre/modules/FileUtils.jsm :: FileUtils_getDir :: line 70" data: no]
Stack trace:
cklist()@resource://gre/modules/AddonManager.jsm:700 AddonManagerInternal.startup()@resource://gre/modules/AddonManager.jsm:870 this.AddonManagerPrivate.startup()@resource://gre/modules/AddonManager.jsm:3033 amManager.prototype.observe()@resource://gre/components/addonManager.js:65
1494001905845 Marionette INFO Listening on port 64280
JavaScript error: resource://gre/modules/AddonManager.jsm, line 2585:
NS_ERROR_NOT_INITIALIZED: AddonManager is not initialized
JavaScript error: resource://gre/modules/FileUtils.jsm, line 70:
NS_ERROR_ILLEGAL_VALUE: Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIFile.create]
どうも、自動起動時にプロファイルを新規作成して、アドオンを読み込もうとするようですが、プロファイルが作れなくて、エラーが出れいるようです。
そのため、上記のJavaコードのように、FirefoxProfileにデフォルトのプロファイルのパスを渡してあげるとエラーが出なくなりました。
Firefoxのプロファイルは通常、ユーザのディレクトリの「AppData\\Roaming\\Mozilla\\Firefox\\Profiles」配下に置かれますので、そこにあるプロファイルへのパスを設定すればOKでした。