为什么多个GET请求失败了量角器测试?

时间:2014-11-17 15:52:50

标签: angularjs phantomjs protractor

我尝试使用PhantomJS浏览器在Amazon EC2环境中运行量角器测试。我知道不建议使用Protractor的PhantomJS用户,但这是我现在唯一的选择。测试始终在Win7环境中运行。

当测试看起来像这样时它总能正常工作

    describe('Portal Login End 2 End test', function() {
    it('should automatically redirect to login /form', function() {
        browser.get('');
        expect(browser.getLocationAbsUrl()).toMatch("/login");
    });

    it('should automatically redirect to dashboard page after successful login', function() {
        element(by.model('user.username')).sendKeys('admin');
        element(by.model('user.password')).sendKeys('admin');
        element(by.buttonText('Sign in')).click();
        expect(browser.getLocationAbsUrl()).toMatch("dashboard/home");
    });
});

但是在beforeEach函数中发出GET请求时,就像这样

    describe('Portal Login End 2 End test', function() {
    beforeEach(function() {
        browser.get('');
    }
    it('should automatically redirect to login', function() {
        expect(browser.getLocationAbsUrl()).toMatch("/login");
    });

    it('should automatically redirect to dashboard page after successful login', function() {
        element(by.model('user.username')).sendKeys('admin');
        element(by.model('user.password')).sendKeys('admin');
        element(by.buttonText('Sign in')).click();
        expect(browser.getLocationAbsUrl()).toMatch("dashboard/home");
    });
});

测试在大多数情况下失败,但并非总是如此,并出现以下错误

  

UnknownError:与远程浏览器通信时出错。它可能已经死了。   构建信息:版本:' 2.43.1',修订版:' 5163bce',时间:' 2014-09-10 16:27:33'   系统信息:主持人:' ip-10-249-98-182',ip:' 10.249.98.182',os.name:' Linux',os .arch:' amd64',os.version:' 2.6.32-504.el6.x86_64',java.version:' 1.6.0_45'   驱动程序信息:driver.version:EventFiringWebDriver

因此,当在同一个测试中发出两个 GET请求时,它通常会失败,但是当只有一个请求发出时,它总是有效。正如我上面所写,两个GET请求在Win7环境中运行良好,但在Linux中运行不正常。

我看过一些有这个错误的帖子,但没有看到如何修复它。那里的人有解决方案吗?

3 个答案:

答案 0 :(得分:0)

我不确定beforeEach是否等待浏览器中的工作完成,但it函数确实等待。尝试将get调用包装在it函数中。

describe('Portal Login End 2 End test', function() {
    beforeEach(function() {
          it('redirects',function(){browser.get('');});
    });
    // .....
});

答案 1 :(得分:0)

如果您遇到问题,正如您所说,是因为浏览器没有等待beforeEach中的get,请添加browser.waitForAngular();

describe('Portal Login End 2 End test', function() {
beforeEach(function() {
    browser.get('');
}
it('should automatically redirect to login', function() {
    browser.waitForAngular();
    expect(browser.getLocationAbsUrl()).toMatch("/login");
});

it('should automatically redirect to dashboard page after successful login', function() {
    element(by.model('user.username')).sendKeys('admin');
    element(by.model('user.password')).sendKeys('admin');
    element(by.buttonText('Sign in')).click();
    expect(browser.getLocationAbsUrl()).toMatch("dashboard/home");
});
});

因为测试是按顺序运行的,所以你不应该在每个块中调用它。

你也可以尝试在beforeEach函数中调用browser.waitForAngular(),虽然我更喜欢在it函数中调用它。

答案 2 :(得分:0)

通过使用beforeEach()函数的功能,可以确保it以预期的方式完成设置的事件,然后再跳至done()部分中的任何一个, Jasmine2.0中包含的功能。这是专门设计用来验证给定事件是否已触发并且是否导致了预期的操作。 在您的代码中,browser.get('')是一个异步过程。您需要await所有此类异步事件触发器,并在done()之后进行确认。

经验法则是在有异步处理时使用它。在编写测试脚本时的最佳编码实践中,done()函数始终传递给beforeEach()afterEach()it()测试方法作为参数,无论是否需要。

如何在代码中实现这一点?

describe('Portal Login End 2 End test', function() {
beforeEach(function(done) {
    browser.get('');
    success: function () {
      done();
    }
}
it('should automatically redirect to login', function() {
    expect(browser.getLocationAbsUrl()).toMatch("/login");
});

it('should automatically redirect to dashboard page after successful login', function() {
    element(by.model('user.username')).sendKeys('admin');
    element(by.model('user.password')).sendKeys('admin');
    element(by.buttonText('Sign in')).click();
    expect(browser.getLocationAbsUrl()).toMatch("dashboard/home");
});
});

希望这会有所帮助,加油!