量角器测试完成Chrome / Firefox但在phantomjs中失败

时间:2014-09-19 07:43:16

标签: angularjs selenium phantomjs protractor

我已经使用运行firefox和chrome的量角器编写了相当数量的E2E测试,并且一切运行良好,但是当我尝试使用phantomjs以便我们可以让它们在我们的CI服务器上运行时,它们会失败:

UnknownError: Error communicating with the remote browser. It may have died.
Build info: version: '2.42.2', revision: '6a6995d', time: '2014-06-03 17:42:03'
System info: host: 'referenemesimac.home', ip: '192.168.1.67', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.9.4', java.version: '1.6.0_65'
Driver info: driver.version: EventFiringWebDriver

有没有人进来过这个?这是我的protractor.conf.js

exports.config = {
  // The address of a running selenium server.
  seleniumAddress: 'http://localhost:4444/wd/hub',

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

  onPrepare: function () {
    var width = 1440;
    var height = 900;
    browser.driver.manage().window().setSize(width, height);
  },

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

  baseUrl: 'http://localhost:3000',

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

};

1 个答案:

答案 0 :(得分:2)

如上所述here

你应该使用 ignoreSynchronization 浏览器的选项和量角器的 sleep()方法让它工作,就像那样:

//
// test/e2e/base/registration.js
//
'use strict';
var $p;

describe('E2E Registration', function() {
  beforeEach(function() {
    $p = protractor.getInstance();
    browser.ignoreSynchronization = true;
    browser.driver.manage().window().setSize(1280, 1024);
  });

  it('should register a user', function() {
    browser.get('/#/register');
    $p.sleep(3000);
    expect(element(by.css('input.sign-up-button')).isPresent()).toBeTruthy();
    element(by.model('user.email')).sendKeys('foo@bar.it');
    element(by.model('user.password')).sendKeys('bar');
    element(by.model('user.repeatPassword')).sendKeys('bar');
    element(by.cssContainingText('option', 'ITALY')).click();
    element(by.css('ins.iCheck-helper')).click();
    element(by.css('input.sign-up-button')).click();
    $p.sleep(3000);
    expect($p.getCurrentUrl()).toMatch(/dashboard/i);
  });
});

是的,我不喜欢它,但它确实有用。

希望有人能更好地回答这个问题。

您还可以尝试将 $ p.sleep()替换为 $ p.waitForAngular(); ,如上所述here