1

私は、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を使用することに頼るかもしれません。

4

4 に答える 4

0

docker を selenium ハブと一緒に使用して、インストールされているブラウザーから独立した隔離された環境をセットアップできます。ハブにはさまざまなブラウザーがありますが、以前はクロムを使用していたので、次をお勧めします。

https://hub.docker.com/r/selenium/standalone-chrome/

docker をインストールしたら、次のコマンドでサーバーを起動できます。

docker run -d -p 4444:4444 selenium/standalone-chrome:latest

その後、ポート 4444 経由で接続できます。

すべてが起動して実行されたら、コードで次のように指定するだけで、Web ドライバーがリモート Selenium ハブを使用していることを確認します。

var webdriver = require("selenium-webdriver");
var driver = new webdriver.Builder()
    .forBrowser('chrome')
    .usingServer('http://localhost:4444/wd/hub')
    .build();

編集:

@sircapsalot が指摘したように、自分でイメージをビルドすることでバージョンを指定できますhttps://github.com/SeleniumHQ/docker-selenium/wiki/Building-your-own-images#specify-chromedriver-and-chrome-versions

于 2016-10-27T19:04:15.543 に答える
0

Chromiumを使用して問題を解決できましたが、Chrome でも動作することを確認するためにテストを行いました。Chrome の問題は、古いリリースを簡単に見つけることができず、新しいバージョンで自動更新を無効にする方法を変更できる (実際に変更している) ことです。Chrome で自動更新を無効にするための提案がいくつかありますが、いくつかは他よりも有効です。

Web サイトのガイドラインに従って、以前のバージョンの Chromium をダウンロードすることにしました (この場合、例としてバージョン 44 を使用しています)。

  1. http://googlechromereleases.blogspot.com/search/label/Stable%20updates で前回の「44」を確認してください。が言及されました。
  2. 位置検索でそのバージョン履歴 ("44.0.2403.157") をループします。
  3. この場合、「330231」の基本位置を返します。これは、2015 年 5 月に 44 リリースが分岐した場所のコミットです。
  4. 継続的なビルドのアーカイブを開く
  5. お使いのプラットフォーム (Linux/Mac/Win) をクリックしてください
  6. 上部のフィルター フィールドに「330231」を貼り付け、すべての結果が XHR に送信されるのを待ちます。

注:番号が一致しない場合があり、リストをスクロールして、表示される次に低い一致までスクロールする必要があることに注意してください。私の状況で作業コピーを見つけるために、いくつかのマッチに戻る必要がありました。

バイナリを取得したら、それを使用する JavaScript ロジックを次に示します (詳細については、Selenium Docsを参照してください)。

// get the webdriver for future operations
var webdriver = require("selenium-webdriver");
// configure the chromedriver
var chrome = require("selenium-webdriver/chrome");
// here I get the path of chromedriver to avoid using path variables
var path = new require("chromedriver").path;
var service = new chrome.ServiceBuilder(path).build();

var options = new chrome.Options();
// Note: on mac you need to reach in the .app folder
options.setChromeBinaryPath("Chromium.app/Contents/MacOS/Chromium");

var driver = new chrome.Driver(options, service);
于 2016-10-28T19:51:17.410 に答える
0

強制的に更新せずに Selenium chromedriver を使用するには?

簡単な答え:

ブラウザの自動更新を無効にします。

自動更新を行うと、Chromedriver を使用して Chrome のバージョンが異なる可能性があります。Firefox と Geckodriver でも同じことが起こります。

アップグレードのプロセスをより制御することをお勧めします。更新の準備ができたら、最新の chrome および chromedriver バージョンに手動で更新します。

于 2016-10-27T18:18:35.723 に答える