Selenium3によるFirefoxの自動操作(Java,Eclipseプロジェクト編)

前回の記事「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などのバージョンは合っているか

WebDriver、言語バインディングは、サポートするFirefoxのバージョンがあります。このバージョンがあっていないと思わぬエラーを引き起こしやすいです。

Firefox用のWebDriverのページの「Supported Firefoxen」セクション等にサポートするFirefoxのバージョンが書いてあったりするので、確認してみましょう。

OSとブラウザのBit数は合っているか

ネイティブの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でした。