量角器:单击按钮后如何等待页面完成?

时间:2014-02-13 08:08:13

标签: jasmine protractor wait

在测试规范中,我需要单击网页上的按钮,然后等待新页面完全加载。

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click();

// ...Here need to wait for page complete... How?

ptor.waitForAngular();
expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');

10 个答案:

答案 0 :(得分:81)

根据您的要求,您可以尝试:

browser.waitForAngular();

btnLoginEl.click().then(function() {
  // do some stuff 
}); 

解决诺言。如果你能在beforeEach中做到这一点会更好。

注意:我注意到expect()在比较之前等待内部的承诺(即getCurrentUrl)。

答案 1 :(得分:26)

我刚看了一下源代码 - Protractor只在少数情况下等待Angular(比如调用element.all或设置/获取位置时)。

所以Protractor在每次命令之后都不会等待Angular稳定下来。

此外,有时在我的测试中,我在Angular摘要周期和点击事件之间进行了比赛,所以有时我必须这样做:

elm.click();
browser.driver.sleep(1000);
browser.waitForAngular();

使用sleep等待执行以进入AngularJS上下文(由click事件触发)。

答案 2 :(得分:25)

你不需要等待。量角器自动等待角度准备就绪,然后执行控制流程中的下一步。

答案 3 :(得分:4)

使用Protractor,您可以使用以下方法

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain newPageName
browser.wait(EC.urlContains('newPageName'), 10000);

所以你的代码看起来像是,

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click();

var EC = protractor.ExpectedConditions;
// Wait for new page url to contain efg
ptor.wait(EC.urlContains('efg'), 10000);

expect(ptor.getCurrentUrl()).toEqual(url + 'abc#/efg');

注意:这可能并不意味着新页面已完成加载且DOM已准备就绪。随后的'expect()'语句将确保Protractor等待DOM可用于测试。

参考:Protractor ExpectedConditions

答案 4 :(得分:3)

在这种情况下,您可以使用:

页面对象:

    waitForURLContain(urlExpected: string, timeout: number) {
        try {
            const condition = browser.ExpectedConditions;
            browser.wait(condition.urlContains(urlExpected), timeout);
        } catch (e) {
            console.error('URL not contain text.', e);
        };
    }

页面测试:

page.waitForURLContain('abc#/efg', 30000);

答案 5 :(得分:2)

我通常只是在控制流程中添加一些东西,即:

it('should navigate to the logfile page when attempting ' +
   'to access the user login page, after logging in', function() {
  userLoginPage.login(true);
  userLoginPage.get();
  logfilePage.expectLogfilePage();
});

logfilePage:

function login() {
  element(by.buttonText('Login')).click();

  // Adding this to the control flow will ensure the resulting page is loaded before moving on
  browser.getLocationAbsUrl();
}

答案 6 :(得分:1)

使用此我认为它更好

   *isAngularSite(false);*
    browser.get(crmUrl);


    login.username.sendKeys(username);
    login.password.sendKeys(password);
    login.submit.click();

    *isAngularSite(true);*

要使用isAngularSite的这个设置,请将它放在你的protractor.conf.js中:

        global.isAngularSite = function(flag) {
        browser.ignoreSynchronization = !flag;
        };

答案 7 :(得分:1)

要等到点击本身完成(即解析 Promise),使用 await 关键字

it('test case 1', async () => {
  await login.submit.click();
})

这将停止命令队列,直到点击(sendKeys、sleep 或任何其他命令)完成

如果您很幸运,并且您使用的是构建良好且没有待处理的微观和宏观任务的 Angular 页面,那么 Protractor 应自行等待,直到页面准备就绪。但有时您需要自己处理等待,例如通过非 Angular 的页面登录时(阅读 how to find out if page has pending tasks and how to work with non angular pages

如果您手动处理等待,browser.wait 是最佳选择。只需向它传递一个具有等待条件的函数即可。比如等到页面没有加载动画

let $animation = $$('.loading');

await browser.wait(
  async () => (await animation.count()) === 0, // function; if returns true it stops waiting; can wait for anything in the world if you get creative with it
  5000, // timeout
  `message on timeout`
);

确保使用await

答案 8 :(得分:0)

您可以做这样的事情

emailEl.sendKeys('jack');
passwordEl.sendKeys('123pwd');

btnLoginEl.click().then(function(){
browser.wait(5000);
});

答案 9 :(得分:-2)

browser.waitForAngular();

btnLoginEl.click().then(function() { Do Something });

解决诺言。