量角器中的陈旧元素参考虽然添加了条件等待

时间:2015-09-24 07:52:41

标签: javascript testing selenium-webdriver protractor

在我的测试类中的beforeEach函数下有问题。 单击usersTab有时可以正常工作,有时会返回StaleElementReferenceException。 已尝试protractor.ExpectedConditions presenceOfvisibilityOfelementToBeClickable,但均未100%合作。 我认为这是由异步引起的,有时浏览器首先要点击然后等待 - 是否可能? 知道如何处理吗?

var OnePage = require('../pages/one_page.js');
var SecondPage = require('../pages/second_page.js');

describe('Test', function () {

    var onePage;
    var secondPage;
    var EC = protractor.ExpectedConditions;

    beforeEach(function () {
        browser.ignoreSynchronization = true;
        onePage = new OnePage();
        browser.wait(EC.presenceOf(onaPage.userLogin), 5000);

        onePage.setUser('login@login');
        onePage.setPassword('password');
        onePage.login();


        secondPage = new SecondPage();
        browser.wait(EC.visibilityOf(secondPage.usersTab), 10000);
        usersPage.usersTab.click();
    });

我正在使用jasmine:2protractor:2.2.0

2 个答案:

答案 0 :(得分:1)

当我第一次开始构建我的测试套件时,我遇到了类似的问题,我花了一些时间来追踪解决方案。使用var函数中的标准beforeEach初始化页面对象时,它可以在运行第二个或更高的测试时保留旧实例。不知道它通常需要多长时间或者在我的测试中真正触发了打嗝,这对我来说总是随机的。我能解决此问题的唯一方法是在我的this函数中使用beforeEach关键字,如下例所示。执行beforeEach函数时,在每次测试中都会正确更新实例。

注意:在onPrepare下的conf.js文件中,我有以下函数设置告诉Protractor,以下页面是否是Angular页面:

global.isAngularSite = function(flag) {
    browser.ignoreSynchronization = !flag;
};
var OnePage    = require('../pages/one_page.js');
var SecondPage = require('../pages/second_page.js');

describe('Test', function () {

    beforeEach(function () {
        isAngularSite(true);

        this.onePage    = new OnePage();
        this.secondPage = new SecondPage();
        this.ec         = protractor.ExpectedConditions;

        browser.wait(this.ec.presenceOf(this.onePage.userLogin), 5000);

        this.onePage.setUser('login@login');
        this.onePage.setPassword('password');
        this.onePage.login();

        browser.wait(this.ec.visibilityOf(this.secondPage.usersTab), 10000);
        usersPage.usersTab.click();
    });

    it('', function() {

    });

});

答案 1 :(得分:0)

尝试将操作相互链接,以便一旦第一个完成解决其承诺,它们就会串行执行。这是怎样的 -

beforeEach(function () {
    browser.ignoreSynchronization = true;

    onePage = new OnePage();
    browser.wait(EC.presenceOf(onaPage.userLogin), 5000).then(function(){
        onePage.setUser('login@login');
        onePage.setPassword('password');
        onePage.login();
    });

    secondPage = new SecondPage();
    browser.wait(EC.visibilityOf(usersPage.usersTab), 10000).then(function(){
        usersPage.usersTab.click().then(function(){
            //If you want to verify something after click, do it here.
            browser.sleep(500);
        });
    });
});

如果您希望第二页操作仅在第一页之后完成,则将它们链接在一起。

    browser.wait(EC.presenceOf(onaPage.userLogin), 5000).then(function(){
        //Actions of OnePage
    }).then(function(){
        //Actions of second page
        secondPage = new SecondPage();
        browser.wait(EC.visibilityOf(usersPage.usersTab), 10000).then(function(){
            usersPage.usersTab.click().then(function(){
                //If you want to verify something after click, do it here.
                browser.sleep(500);
            });
        });
    });

希望这有帮助。