超时等待异步Angular任务在11秒后完成

时间:2018-03-14 20:22:30

标签: angular protractor

我是Protractor的新手,我正在尝试为一个非常简单的场景编写测试用例:转到登录页面并提交表单,重定向到仪表板页面,然后单击仪表板上的搜索按钮。登录部分工作正常:

页/ login.js:

'use strict';

var LoginPage = function () {
    this.email = element(by.css('#email'));
    this.password = element(by.css('#password'));
    this.submit = element(by.css('[type="submit"]'));

    expect(this.email.isPresent()).toBe(true, 'Email field not found');
    expect(this.password.isPresent()).toBe(true, 'Password field not found');
    expect(this.submit.isPresent()).toBe(true, 'Submit button not found');
};

module.exports = new LoginPage();

测试spec.js:

it('should log in', function () {
        console.log('Logging into Application.');
        browser.get('https://example.com/auth/login');

        var loginPage = require('./pages/login');
        loginPage.email.sendKeys('myemail@example.com');
        loginPage.password.sendKeys('mypassword');
        loginPage.submit.click();

        console.log('Waiting to be redirected to the dashboard page...');
        return browser.driver.wait(function () {
            return browser.driver.getCurrentUrl().then(function (url) {
                return /dashboard/.test(url);
            });
        }, 30000);
    });

然而,当我尝试找到搜索按钮并点击它时......

页/ dashboard.js:

'use strict';

    var DashboardPage = function () {
        var elementFromSecondPage = $('a[href*="/property/search"]');
        console.log('trying to wait for element to be visible: ' + elementFromSecondPage);
        browser.wait(protractor.until.elementIsVisible(elementFromSecondPage), 60000, 'Error: Element did not display within 1 minute');
        console.log('done waiting');

        console.log('trying to find this.search element');
        this.search = element(by.css('a[href*="/property/search"]'));
        console.log('this.search: ' + this.search);

        expect(this.search.isPresent()).toBe(true, 'Search button not found');
    };

    module.exports = new DashboardPage();

测试spec.js:

it('should go to search', function () {
        console.log('Going to the Search page.');
        var dashboardPage = require('./pages/dashboard');
        dashboardPage.search.click();
    });

尝试查找搜索按钮时,错误:

登录上游。
等待重定向到仪表板页面...
转到搜索页面。
试图等待元素可见:[object Object]
完成等待 试图找到this.search元素 this.search:[object Object]
失败:1)angularjs上游添加列表应该去搜索消息:失败:超时等待异步角度任务在11秒后完成。这可能是因为当前页面不是Angular应用程序。有关详细信息,请参阅常见问题解答:https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular在等待带定位符的元素时 - 定位器:By(css选择器,[href * =“/ property / search”])

以下是我正在搜索的元素的html:

<a routerlinkactive="active" class="caret rpr-labeled-button rpr-labeled-button-search-alt active" href="/property/search">
...     
</a>

我尝试了许多不同的解决方案来尝试等待仪表板页面及其DOM加载,但无论如何我仍然会收到此错误。这很令人困惑,因为如果你看看上面的输出,当我做一个jQuery找到它成功加载元素,所以它显然在那里。

3 个答案:

答案 0 :(得分:1)

这个问题最终成为了@Gunderson所建议的。 Angular正在进行连续(轮询)网络调用,因此Protractor从未将其视为“完成”加载。因此,无论我等多久,每个查找元素调用都会超时。

作为黑客,我使用此命令禁用等待:

browser.waitForAngularEnabled(false);

然而,如果它没有特别等待Angular应用程序,那么使用Protractor而不是另一个测试框架有什么意义呢?然后,我们更改了我们正在测试的Web应用程序,以便在对其运行测试时禁用轮询(通过登录页面上的查询字符串参数),然后一切都开始运行良好。

答案 1 :(得分:0)

所有browser.wait()都会安排一个等待条件的命令。您表明您的JQuery选择器$('a[href*="/property/search"]');正在努力获取该元素。 可能的解决方法是创建自己的函数,该函数具有自己的超时,并将使用该选择器查找元素并返回布尔值true,一旦找到元素,或者在超时时返回false。

function waitForElem(){
   //JQuery timeout logic here
   if(elementFound){ return true}
   else{//after some time interval
         return false;
   }
}

然后在你的Protractor代码中仍然使用browser.wait()

browser.wait(waitFormElem(), 60000, 'Error: Element did not display within 1 minute');

我为伪代码道歉,但我真的不知道JQuery,看起来你这样做了,我觉得你已经足够了解实现那个逻辑

答案 2 :(得分:0)

您可以使用此库: https://www.protractortest.org/#/api?view=ProtractorExpectedConditions 有几个选项可以让等待元素可见,可点击,包含一些文本,检查最适合你的内容。我通常会将元素看得像这样:

{{1}}