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

时间:2014-11-06 23:10:51

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

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

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

问题1)你叫什么名字?

问题2)几点了?

问题3)Wy你在这儿吗?

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

回答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
}

等等......等等......

但我遇到的问题是Protractor会在它到达那一点之前立即运行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');
      }
  };

3 个答案:

答案 0 :(得分:3)

Protractor构建于WebdriverJS之上,后者使用隐式承诺排队的编程风格。参见:

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

这意味着量角器测试中的每个语句都应该被读作入队承诺,而不是实际执行。例如,行:

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

是否会返回文字,但会返回承诺以返回文字。您必须将此承诺传递给其他承诺期望的API,或者使用.then()提供直接处理程序。

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

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

实际上是一个承诺,将左边承诺的结果与右边的值进行比较。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

即使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;
    }
});