私は、nwjs/node.js でデータ駆動型のDSL命令を使用するブラウザー自動化アプリケーションを開発しています。
package.json の次の依存関係を介して、chromedriver と selenium webdriver に npm パッケージを使用することにしました。
"dependencies": {
"selenium-webdriver": "~3.0.0-beta-2",
"chromedriver": "~2.23.1"
}
最近、単純に chromedriver を起動した時点でアプリケーションが動作を停止するまで、すべてが順調に進んでいました。
var webdriver = require("selenium-webdriver");
var driver = new webdriver.Builder().forBrowser('chrome').build();
Macbook のターミナルで実行すると、次のエラーが表示されます。
/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/promise.js:654
throw error;
^
SessionNotCreatedError: session not created exception
from unknown error: Runtime.evaluate missing 'wasThrown'
(Session info: chrome=54.0.2840.71)
(Driver info: chromedriver=2.23.409710 (0c4084804897ac45b5ff65a690ec6583b97225c0),platform=Mac OS X 10.11.5 x86_64)
at WebDriverError (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/error.js:27:5)
at SessionNotCreatedError (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/error.js:214:5)
at Object.checkLegacyResponse (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/error.js:505:15)
at parseHttpResponse (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/http.js:396:13)
at doSend.then.response (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/http.js:328:11)
at process._tickCallback (internal/process/next_tick.js:103:7)
From: Task: WebDriver.createSession()
at Function.createSession (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:366:24)
at Driver (/Users/matthewsanders/test1/node_modules/selenium-webdriver/chrome.js:804:38)
at Builder.build (/Users/matthewsanders/test1/node_modules/selenium-webdriver/index.js:546:16)
at Object.<anonymous> (/Users/matthewsanders/test1/index.js:4:59)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
From: Task: WebDriver.navigate().to(http://www.google.com)
at Driver.schedule (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:414:17)
at Navigation.to (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:1042:25)
at Driver.get (/Users/matthewsanders/test1/node_modules/selenium-webdriver/lib/webdriver.js:832:28)
at Object.<anonymous> (/Users/matthewsanders/test1/index.js:6:8)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
プロジェクトで導入した問題ではないことを確認するために、当時作成したいくつかのテスト アプリケーションに対してもテストを行いました。
次に、 geckodriverforBrowser
をダウンロードした後、メソッドで「firefox」を使用しようとしましたが、これは完全に機能しました。
chromedriver のある種の自動更新が私のプロジェクトを壊したかのように見えます。同様のエラーに関連するスタックオーバーフローに関する他のいくつかの質問に気付きましたが、Runtime.evaluate missing 'wasThrown'
エラーは含まれていませんでしたが、私の理論がおそらく正しいことを示唆しているようです。
先に進んでgeckodriverに切り替えることもできますが、今後同様の問題に遭遇するかどうかはわかりません。
ここでの本当の質問は...
自動更新を無効にして、このアプリケーションをスタンドアロン プロジェクトとして実行し続けるにはどうすればよいですか?
繰り返しますが、これは常に最新のテスト スイートとしてではなく、カスタム言語によって駆動されるブラウザー自動化アプリケーションとして意図されています。これは、ホストされた node.js インスタンスを介した自動化されたソリューションとして、または nwjs で実行されるオペレーター主導の GUI アプリケーションとして動作します。
編集:
これまでのところ、有望なアプローチを見つけました。好みに合わせて動作するようになったら、回答を追加します。
Seleniumのドキュメントには、chromedriver オプションをカスタマイズする方法に関する情報が含まれています。Chromiumのバージョンをダウンロードし、このロジックを使用して接続しました。
var chrome = require("selenium-webdriver/chrome");
var service = new chrome.ServiceBuilder().build();
var options = new chrome.Options();
options.setChromeBinaryPath("PATH/TO/MY/CHROMIUM");
var driver = new chrome.Driver(options, service);
注: Mac では、アプリ パッケージ内の実際の実行可能ファイルのパスを指定する必要があります (例: 'Chromium.app/Contents/MacOS/Chromium')。
これまでのところ、Chrome ではなく Chromium を使用しており、バージョンはまだ正しくありませんが、パスを設定せずに実行しているものとは異なることを確認しました。理論的には、アプリケーションをスタンドアロンでパッケージ化しながら自動更新プロセスを確実にフリーズできれば、同じ方法で Chrome を実行できるはずです。それがうまくいかない場合は、Chromiumを使用することに頼るかもしれません。