【问题标题】:Why is Protractor running every line of code immediately?为什么 Protractor 会立即运行每一行代码?
【发布时间】:2015-01-03 15:37:01
【问题描述】:

为什么 Protractor 会立即运行每一行代码?

所以我有一个不是用 Angular 编写的网页。我需要我的基于硒的自动化来实现。我已经使用 selenium webdriver-js 代码来实现它。下面的例子。登录后,您将进入包含 3 个问题的页面。每次登录时,问题的顺序都是随机的。因此,您每次登录时可能永远不会以相同的顺序收到相同的问题。

问题 1) 你叫什么名字?

问题 2) 现在几点了?

问题 3)你为什么在这里?

每个问题的答案都是问题的最后一句话。

答案 1) 姓名

回答 2) 它

答案 3) 在这里

所以我想解决这个问题的一个简单方法是创建一个 if 条件语句

var foo = browser.driver.findElement(By.id('question1')).getText();
if(foo == What is your name?) {
browser.driver.findElement(By.id('answer1')).sendKeys('name');
}
else {
blah
}

等等……等等……

但我遇到的问题是量角器在到达该点之前立即运行 if 语句。在下面的示例中,控制台立即打印出控制台日志“这太糟糕了”,因为它立即运行 if 语句,而没有经过第一步到达页面然后检查。

  this.foo_test = function() {
      console.log('starting foo test');
      browser.driver.get('http://my-test-url.com/');
      browser.sleep(3000);
      browser.driver.findElement(By.id('login')).click();
      browser.sleep(3000);
      browser.driver.findElement(By.id('user')).sendKeys('user');
      browser.driver.findElement(By.id('login_button')).click();
      browser.sleep(3000);

      console.log('getting variable');
      var foo = browser.driver.findElement(By.id('question1')).getText();
      console.log(foo);
      if (foo == 'What was the name of your first pet?') {
          console.log('this is cool');
      }
      else{
          console.log('this sucks');
      }
  };

【问题讨论】:

    标签: javascript angularjs node.js selenium-webdriver protractor


    【解决方案1】:

    Protractor 基于 WebdriverJS 构建,它使用隐式承诺排队风格的编程。见:

    https://github.com/angular/protractor/blob/master/docs/control-flow.md

    这意味着量角器测试中的每条语句都应该被理解为对承诺的排队,而不是实际执行。例如,以下行:

    browser.driver.findElement(By.id('question1')).getText()
    

    返回文本,但返回一个promise返回文本。您必须将此承诺传递给其他预期承诺的 API,或使用 .then() 提供直接处理程序。

    您在 Protractor 测试中看到的 expect 调用已被修改为等待承诺解决。所以像:

    expect(name.getText()).toEqual('Jane Doe');
    

    实际上是把一个promise加入队列来比较左边promise的结果和右边的值。

    【讨论】:

      【解决方案2】:

      我对 Protractor 了解不多,但这听起来像是无法识别异步代码的问题。如果第一个赋值语句是异步的,那么其余代码将在不等待它完成的情况下运行。因此,当您尝试在 IF 语句中测试它们时,您期望的值将不存在。

      最好的办法是在回调或承诺中运行其余代码。

      【讨论】:

        【解决方案3】:

        即使 selenium 认为它已完成,您的页面似乎仍在加载。动态/异步页面经常发生这种情况。

        browser.sleep() 不太合适,你永远不知道你需要等待多长时间。

        您可以研究 WebDriverWait 类,它允许您等待元素出现或超时。

        Wait<WebDriver> wait = new WebDriverWait(driver, 50); // timeout is 50 secs
        wait.until(new Function<WebDriver, Boolean>() {
            public Boolean apply(WebDriver driver) {
                return (driver.findElement(By.id('question1'))).isDisplayed();
            }
        });
        

        您也可以尝试运行一些 javascript 来检查文档就绪状态:

        Wait<WebDriver> wait = new WebDriverWait(driver, 60); // timeout is 60 secs
        wait.until(new Function<WebDriver, Boolean>() {
            public Boolean apply(WebDriver driver) {
                String docReady = "";
                Boolean rc = true;
                if (null != ((RemoteWebDriver)driver).getSessionId()) {
                    docReady = String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"));
                    rc = docReady.equals("complete");
                }
                return rc;
            }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-07-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          相关资源
          最近更新 更多