web-dev-qa-db-ja.com

PhantomJSでテストを実行する分度器

PhantomJSをテストで正常に取得できないようです。それをプロジェクトに統合しようとしましたが、失敗した後、基本的なAngular Docsサンプルを実行しようとしましたが、同じ問題が発生します。これまでの手順:

  • npm install -g phantomjs
  • phantomjs --webdriver=9515 // ... GhostDriver-メイン-ポート9515で実行
  • protractor protractorConf.js

これは、browserNameのみを使用した例と同じファイルであり、seleniumAddressポートが変更されています。

// An example configuration file.
exports.config = {
  // The address of a running Selenium server.
  seleniumAddress: 'http://localhost:9515',

  // Capabilities to be passed to the webdriver instance.
  capabilities: {
    'browserName': 'phantomjs'
  },

  // Spec patterns are relative to the current working directly when
  // protractor is called.
  specs: ['onProtractorRunner.js'],

  // Options to be passed to Jasmine-node.
  jasmineNodeOpts: {
    showColors: true,
  }
};

次のエラーメッセージが表示されます。

UnknownError: Error Message => 'Detected a page unload event; asynchronous script execution does not work across page loads.'

私は githubのこの問題 を見つけました。これは関連しているようです。私は彼らの brower-setup.md を十分に理解して、それを私のbeforeEach関数の1つに含めることができたと思いました。それから私は ここptorがとにかくドライバーをラップしているだけだとわかりました。うわー、私はここ分度器/セレンの土地の初心者であることを知っていますが、信号対雑音比は集中的に説得力があります。 PhantomJSを使用することでパフォーマンス上のメリットを享受したいのですが、これでさらに数時間を失う可能性があるため、頭が痛いです。問題が発生した場合に備えて、私はWindows 7 Enterprise64ビットを使用しています。ありがとう!

14
bodine

実際、この修正は私にとって同じ問題を解決していました:

https://github.com/pschwartau/protractor/commit/1eeff8b1b2e3e8f3b7c8152264411f26d4665a07

ここで最初に説明したように: https://github.com/angular/protractor/issues/85#issuecomment-26846255 by renanmartins


Protractor/lib /protractor.jsの内部置換

this.driver.get('about:blank');
this.driver.executeScript(
    'window.name = "' + DEFER_LABEL + '" + window.name;' +
    'window.location.href = "' + destination + '"');

  var driver = this.driver;
  this.getCapabilities().then(function (capabilities) {
    if (capabilities.caps_.browserName === 'phantomjs') {
      driver.executeScript('window.name = "' + DEFER_LABEL + '" + window.name;');
      driver.get(destination);
    } else {
      driver.get('about:blank');
      driver.executeScript(
          'window.name = "' + DEFER_LABEL + '" + window.name;' +
          'window.location.href = "' + destination + '"');
    }

    // Make sure the page is an Angular page.
    driver.executeAsyncScript(clientSideScripts.testForAngular, 10).
      then(function(hasAngular) {
        if (!hasAngular) {
          throw new Error('Angular could not be found on the page ' +
              destination);
        }
      });
  });
3
Michael