2012年6月5日火曜日

[Selenium 2] Firefox起動時のポートロック待ち時間変更方法

試した環境

  • ブラウザ:Firefox 9
  • JDK 6
  • Selenium 2.18, 2.21, 2.22
  • Windows 7 64bit

ある日のこと、Seleniumテストケースを並行して数十個同時にスタートした時、以下の例外が発生した。

org.openqa.selenium.WebDriverException: Unable to bind to locking port 7054 within 45000 ms
…

調べてみると、どうもSeleniumはブラウザプロセス起動する時にTCP7054番ポートをロックするらしく、このポートのロックを一定時間待っても獲得できない場合に上記例外が発生する模様。ちなみにロックはプロセス起動したら開放されるっぽい。

この値はFirefoxBinaryクラスのtimeoutプロパティの値で、デフォルトでは45秒。変更したい場合は以下のように、タイムアウト値を設定したFirefoxBinaryオブジェクトをコンストラクタに渡せばよい。

同時にCapabilitiesオブジェクトも使いたいんだけど…

例えばプロキシを使用する場合は、以下のようにCapabilitiesを使用する訳ですが…

FirefoxDriverのコンストラクタには、FirefoxBinaryとCapabilitiesをパラメータとするものが用意されていません。どうしたらいいんでしょう。Help me...的な事を当初書いていたら、hutyaoさんからコメント欄にてご教示いただけました。ありがとうございます!
CapabilitiesオブジェクトにFirefoxBinaryを入れる

それと、プロキシ設定はCapabilitiesオブジェクトではなくFirefoxProfileでも指定可能だよってことも教えていただきました。

<非推奨>
FirefoxDriverのソースからメソッドコピペするというダッサイ方法
僕の頭ではこんな方法しか思いつきませんでした…

以下のimport文とメソッドをコピーし、適当なクラスに貼り付けてください。アクセス修飾子はprivateなので、適宜変更してください。

そしてFirefox起動ロジックは以下のような感じで。

僕は上記コピペメソッドや一連の生成ロジックはFactoryクラスに持たせています。

コピペなんてDRYの原則に反してるじゃねぇか!って方はSeleniumのソース弄ってください。僕としては、コピペ元はjarの中のソースなんで別にいいかなって思いますけど。

※繰り返しますが当節の方法は非推奨です。

2 件のコメント:

  1. こんにちは。

    待ち時間とプロキシの設定を同時に変更するには、2通りの方法があるかと思います。
    ひとつは、DesiredCapabilitiesにFirefoxBinaryのオブジェクトを入れてしまう方法です。
    具体的なソースコードは以下のようになります。

    FirefoxBinary binary = new FirefoxBinary();
    binary.setTimeout(60 * 1000);

    String proxyAddr = "1.2.3.4:5678";
    Proxy proxy = new Proxy();
    proxy.setHttpProxy(proxyAddr).setSslProxy(proxyAddr);

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability(FirefoxDriver.BINARY, binary);
    capabilities.setCapability(CapabilityType.PROXY, proxy);

    WebDriver driver = new FirefoxDriver(capabilities);


    もうひとつは、プロキシの設定をFirefoxProfileに入れる方法です。
    具体的なソースコードは以下のようになります。

    FirefoxBinary binary = new FirefoxBinary();
    binary.setTimeout(60 * 1000);

    String proxyAddr = "1.2.3.4:5678";
    Proxy proxy = new Proxy();
    proxy.setHttpProxy(proxyAddr).setSslProxy(proxyAddr);

    FirefoxProfile profile = new FirefoxProfile();
    profile.setProxyPreferences(proxy);

    WebDriver driver = new FirefoxDriver(binary, profile);


    DesiredCapabilitiesを使用したい場合は前の方法が良いと思いますが、プロキシと待ち時間の設定のみで良いということでしたら、後の方法で問題ないと思います。

    返信削除
  2. Re: hutyaoさん
    こんにちは!ご教示ありがとうございます。
    綺麗です!そして俺ダサイッ!!

    いただいたノウハウは記事本文に引用させていただきました。
    どうもありがとうございました!
    やっぱ低レベルと言えども情報発信するもんだな~

    返信削除