使用Protractor进行间歇性测试失败 - 承诺执行订单?

时间:2017-03-20 11:39:33

标签: angularjs jenkins protractor e2e-testing

我在一系列测试套件中面临间歇性的量角器测试失败,在失败的情况下没有任何实际模式来指示可能发生的事情,例如,它不是失败的相同测试。有时我会遇到很多失败,而在其他情况下只会出现一次失败案例。

我应该指出,这只会在我们配置的Jenkins CI服务器(在linux下运行)上执行测试运行时发生。在Windows开发机器上,我们可以在30-40次运行之后得到一个单一的故障情况,我可以忍受!

我们正在测试的应用程序目前使用角度1.5构建,我们使用角度材料1.1.3

由于角度材质中使用的动画和这些可能带来的性能影响,我们已经尝试按照这种方法here禁用动画,这肯定会使测试更快,但对我们看到的失败案例没有帮助/

我现在正处于一次又一次运行一个测试套件的位置,经过5次成功运行后,它失败了它在我们的Jenkins CI环境\ linux盒子上的第6次尝试,在本地我运行了这个测试很多次,现在还没有失败。

下面详细介绍了相关测试套件以及页面对象文件摘要:

//test suite
describe('Operators View', function () {
  var operatorPage = require('./operators.po.js'),
    loginView = require('../login/login.po.js'),
    page = new operatorPage();

  describe('Large screen tests', function () {
    beforeAll(function () {
      loginView.login();
    });

    afterAll(function () {
      loginView.logout();
    });

    it('should create an operator', function () {
      page.settlementBtn.click();
      page.operatorsBtn.click();
      page.fabBtn.click();
      page.createOperator();
      expect(page.headline.getText()).toEqual('Operators');
    });
    });
});

// operators.po.js
var operatorsSection = function() {
    this.helper = new Helpers();
    this.headline = element(by.css('.md-headline'));
    this.settlementBtn = element(by.css('[ui-sref="settlement"]'));
    this.operatorsBtn = element(by.css('[ui-sref="operators"]'));
    this.fabBtn = element(by.css('.md-fab'));

    // Form Elements
    this.licenceNumber = element(by.model('vm.transportOperator.licenceNumber'));
    this.tradingName = element(by.model('vm.tradingName'));
    this.name = element(by.model('vm.name'));
    this.operatorAddressFirstLine = element(by.model('vm.transportOperator.address.line1'));
    this.operatorAddressCityTown = element(by.model('vm.transportOperator.address.line5'));
    this.operatorAddressPostCode = element(by.model('vm.transportOperator.address.postcode'));
    this.payeeAddressFirstLine = element(by.model('vm.transportOperator.payee.address.line1'));
    this.payeeAddressCityTown = element(by.model('vm.transportOperator.payee.address.line4'));
    this.payeeAddressPostCode = element(by.model('vm.transportOperator.payee.address.postcode'));
    this.opID = element(by.model('vm.transportOperator.fields.opID'));
    this.spID = element(by.model('vm.transportOperator.fields.spID'));
    this.schemeSelect = element(by.model('reference.scheme'));
    this.schemeOptions = element(by.exactRepeater('scheme in vm.schemes').row('0'));
    this.alias = element(by.model('reference.alias'));
    this.reference = element(by.model('reference.reference'));
    this.saveBtn = element(by.css('.md-raised'));


    this.createOperator = function() {
      this.licenceNumber.sendKeys(this.helper.getRandomId(10));
      this.tradingName.sendKeys('Protractor Trade Name LTD');
      this.name.sendKeys('Protractor Trade Name');
      this.operatorAddressFirstLine.sendKeys('Protractor Town');
      this.operatorAddressCityTown.sendKeys('Cardiff');
      this.operatorAddressPostCode.sendKeys('PT4 4TP');
      this.payeeAddressFirstLine.sendKeys('Protractor Town');
      this.payeeAddressCityTown.sendKeys('Cardiff');
      this.payeeAddressPostCode.sendKeys('PT4 4TP');
      this.opID.sendKeys('177');
      this.spID.sendKeys('Protractor Spid');
      this.schemeSelect.click();
      this.schemeOptions.click();
      this.alias.sendKeys('PTAlias');
      this.reference.sendKeys('Protractor');
      this.saveBtn.click();
    }

  };
module.exports = operatorsSection;

在调用PO文件中调用createOperator并且单击savteBtn之后,在此测试套件中,应用程序将转换到显示已创建条目表的状态(成功创建后)当然)。我们也使用角度ui-router,目前版本为0.2.18

期望失败了:

  

预期'创建运营商'平等运营商'。

然而,随附的屏幕截图显示了带有'操作员'的表格视图。标题,似乎调用期望调用中的page.headline.getText()太快了,所以在数据库操作之前创建项目并且页面更改有机会完成?

我开始想知道这是否可以达到量角器执行的承诺的顺序。我在文章中谈到了量角器中的控制流程以及为什么有时候你应该使用.then()来探讨量角器调用的结果 - 我发现this

让我想知道我是否应该将调用移到我的saveBtn.click(),这是在我的页面对象的createOperator函数末尾调用的,进入测试套件,所以做一些事情:

it('should create an operator', function () {
      page.settlementBtn.click();
      page.operatorsBtn.click();
      page.fabBtn.click();
      page.createOperator();
      page.saveBtn.click().then(function(){
        expect(page.headline.getText()).toEqual('Operators');
      });
    });

我开始在这里抓住吸管,说实话,所以来自社区的任何想法和建议都会非常感激。

谢谢!

1 个答案:

答案 0 :(得分:2)

根据要求,这是我用来等待URL的功能。

public waitForUrlToBeLike (urlPart: string, timeout: number = 10000) {
    return browser.wait(() => {
        return browser.driver.getCurrentUrl().then((url) => {
            let regex = new RegExp(urlPart);
            return regex.test(url);
        });
    }, timeout);
}

在对它们进行断言之前,我还要使用以下内容来等待元素出现:

public waitTillPresent (element: ElementFinder, timeout: number = 10000) {
    return browser.wait(() => {
        return element.isPresent();
    }, timeout);
}