在Protractor / Webdriver中等待页面重定向

时间:2015-09-29 21:48:44

标签: angularjs unit-testing selenium selenium-webdriver protractor

我有一个点按按钮并重定向到用户信息中心的测试。发生这种情况时,Webdriver返回: javascript error: document unloaded while waiting for result.

为了解决这个问题,我在发生重定向的位置插入browser.sleep(2000)并假设我的CPU使用率很低,这就解决了这个问题。但是,2000毫秒是任意而缓慢的。是否有类似browser.waitForAngular()的内容会等待expect(..)之前在重定向页面上加载角度?

it('should create a new user', () => {
  $signUp.click();
  $email.sendKeys((new Date().getTime()) + '@.com');
  $password.sendKeys('12345');
  $submit.click();

  browser.sleep(2000); // Need alternative to sleep...

  // This doesn't do it...
  // browser.sleep(1);
  // browser.waitForAngular();

  $body.evaluate('user')
  .then((user) => {
    expect(user).toBe(true);
  });
});

3 个答案:

答案 0 :(得分:11)

你认为这样的事情对你有用吗?这将最多等待10秒,以便网址包含文字' pageTwo'或其他任何内容。

var nextPageButton = $('#nextPage');
nextPageButton.click().then(function(){
    return browser.driver.wait(function() {
      return browser.driver.getCurrentUrl().then(function(url) {
        return /pageTwo/.test(url);
      });
    }, 10000);
};

只需坚持你期望的url的正则表达式。

或者,您也可以等待下一页中的元素出现:

var nextPageButton = $('#nextPage');
nextPageButton.click();

var elementFromSecondPage = $('#coolElement');
browser.wait(protractor.until.elementIsVisible(elementFromSecondPage), 5000, 'Error: Element did not display within 5 seconds');

当使用.click时,量角器会自然地等待角度来完成附加到点击的动作,例如更改页面。但是,在页面更改时,您可能仍需要特定的内容才能加载,因此在该部分可用之前测试失败。使用它,它应该等待点击部分完成,然后等待元素出现。

答案 1 :(得分:4)

要扩展user2020347的答案: 谢谢,这解决了我的问题。我想知道为什么这不是一个内置的功能。我会在很多地方使用它来等待浏览器导航。

为了使它更简洁,我做了一个小帮手:

Object.assign(global, {
  waitUntilURLContains: string => {
    let fn = () => {
      return browser.driver.wait(() => {
        return browser.driver.getCurrentUrl().then((url) => {
          return url.includes(string);
        });
      }, waitDelay);
    }

    return fn.bind(null, string);
  }
});

在我的测试中:

$button.click().then(waitUntilURLContains('dashboard'));

答案 2 :(得分:1)

保持简单。我也遇到了同样的问题但是能够使用以下代码解决它:

      page.setUsername(objectrepository.userdetails.useremail);
      page.setPassword(objectrepository.userdetails.userpassword);
      page.login().click();
      **browser.wait(EC.visibilityOf(page.greetingMessageElement()), 5000);**

      page.greetingMessageElement().getText()
      .then(function (value){
         expect(browser.getCurrentUrl()).toContain("#/mytickets");
      });