【问题标题】:Wait for page redirection in Protractor / Webdriver在 Protractor / Webdriver 中等待页面重定向
【发布时间】:2015-09-29 21:48:43
【问题描述】:

我有一个单击按钮并重定向到用户仪表板的测试。发生这种情况时,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);
  });
});

【问题讨论】:

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


    【解决方案1】:

    你认为这样的事情对你有用吗?这将等待 10 秒,让 url 包含文本“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);
    };
    

    只需坚持您期望的网址的正则表达式即可。

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

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

    在使用.click的时候,protractor自然会等待angular完成click附加的动作,比如换页。但是,当页面发生变化时,您可能仍需要加载特定的内容,因此在该部分可用之前测试失败。使用这个,它应该等待点击部分完成,然后等待元素出现。

    【讨论】:

      【解决方案2】:

      扩展 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'));
      

      【讨论】:

      • 这真的会像 browser.get 一样等待页面完成加载然后检查吗?我担心这只是在当前 URL 中寻找输入字符串。
      【解决方案3】:

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

            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");
            }); 
      

      【讨论】:

        猜你喜欢
        • 2017-02-21
        • 2011-09-21
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多