javaでSelenium + GeckoDriver(Firefox) + SeleniumでWebクローラを作成しております。
GeckoDriverに --marionette-port 33333の起動オプションを与えたいのですが、できずにいます。
下記のコードで(*1)はGeckDriver起動オプションなしの例です。
それを(*2)に変えましたが、
The driver executable does not exist: /usr/bin/geckodriver --marionette-port 33333
の例外が発生します。
コマンドラインで
/usr/bin/geckodriver --marionette-port 33333
が正しく起動するのは確認済みです。
経緯:
クローラを連続運用すると、不定期なタイミングで
Marionette ERROR Error on starting server: [Exception... "Component returned failure code: 0x804b0036 (NS_ERROR_SOCKET_ADDRESS_IN_USE) [nsIServerSocket.initSpecialConnection]" nsresult: "0x804b0036 (NS_ERROR_SOCKET_ADDRESS_IN_USE)" location: "JS frame :: chrome://marionette/content/server.js :: MarionetteServer.prototype.start :: line 95" data: no]
のような例外でFirefoxの起動に失敗します。
例外メッセージから、すでにバインド済みのポートを使おうとして起動に失敗していると想像しました。
運用中のログには、
Marionette INFO Listening on port 35714
のようにListenしてるポートが記録されていますが、
webDriver取得の度に、ランダムにポートが選ばれ、この時に運悪くバインド済みのポートを引き当てると、
例外が発生するのでは?と考えました。
Firefoxは、GeckoDriver経由で起動されるため、GeckoDriverに --marionette-portの起動オプションを
与える方法を探っております。
lang
1現状のコード 2 3DesiredCapabilities capabilities = DesiredCapabilities.firefox(); 4capabilities.setBrowserName("firefox"); 5capabilities.setPlatform(Platform.WIN10); 6capabilities.setJavascriptEnabled(false); 7 8//firefox(marionette)とGeckoDriverの通信ポートを指定 9String portParam = " --marionette-port 33333"; 10 11//↓GeckoDriverは起動する 12(*1)System.setProperty("webdriver.gecko.driver","/usr/bin/geckodriver"); 13 14//↓GeckoDriverは起動しない。 15//例外が発生 16//java.lang.IllegalStateException: 17// The driver executable does not exist: /usr/bin/geckodriver --marionette-port 33333 18(*2)System.setProperty("webdriver.gecko.driver","/usr/bin/geckodriver" + portParam); 19 20WebDriver driver = new FirefoxDriver(capabilities);
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。