Javascript 为什么量角器会立即运行每一行代码?

Javascript 为什么量角器会立即运行每一行代码?,javascript,angularjs,node.js,selenium-webdriver,protractor,Javascript,Angularjs,Node.js,Selenium Webdriver,Protractor,为什么量角器会立即运行每一行代码 因此,我有一个网页,是不是写在角度。我需要基于selenium的自动化来实现。我使用了SeleniumWebDriver js代码来实现它。下面的例子。登录后,您将进入一个包含3个问题的页面。每次登录时,问题的顺序都是随机的。因此,每次登录时,您可能永远不会以相同的顺序收到相同的问题 问题1)你叫什么名字 问题2)现在几点了 问题3)你在吗 每个问题的答案是问题的最后一句话 答复1)姓名 回答2)它 回答3)这里 所以我想解决这个问题的简单方法是创建一个if条件

为什么量角器会立即运行每一行代码

因此,我有一个网页,是不是写在角度。我需要基于selenium的自动化来实现。我使用了SeleniumWebDriver 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语句。在下面的示例中,控制台会立即打印出控制台日志“this sucks”,因为它会立即运行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');
      }
  };

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


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

尽管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();
    }
});
Wait Wait=newwebdriverwait(驱动程序,50);//超时时间为50秒
wait.until(新函数(){
公共布尔应用(WebDriver驱动程序){
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;
    }
});
Wait Wait=newwebdriverwait(驱动程序,60);//超时时间为60秒
wait.until(新函数(){
公共布尔应用(WebDriver驱动程序){
字符串docReady=“”;
布尔rc=true;
if(null!=((RemoteWebDriver)driver.getSessionId()){
docReady=String.valueOf((JavascriptExecutor)driver.executeScript(“return document.readyState”);
rc=docReady.equals(“完成”);
}
返回rc;
}
});

量角器构建在WebdriverJS上,它使用隐式承诺队列编程风格。见:

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

browser.driver.findElement(By.id('question1')).getText()
不返回文本,但返回返回返回文本的承诺。您必须将此承诺传递给其他期望承诺的API,或者使用
.then()
提供直接处理程序

您在量角器测试中看到的
expect
调用已修改为等待承诺解决。比如:

expect(name.getText()).toEqual('Jane Doe');
实际上是让一个承诺排队以比较左边承诺的结果和右边的值