Javascript 为什么量角器会立即运行每一行代码?
为什么量角器会立即运行每一行代码 因此,我有一个网页,是不是写在角度。我需要基于selenium的自动化来实现。我使用了SeleniumWebDriver js代码来实现它。下面的例子。登录后,您将进入一个包含3个问题的页面。每次登录时,问题的顺序都是随机的。因此,每次登录时,您可能永远不会以相同的顺序收到相同的问题 问题1)你叫什么名字 问题2)现在几点了 问题3)你在吗 每个问题的答案是问题的最后一句话 答复1)姓名 回答2)它 回答3)这里 所以我想解决这个问题的简单方法是创建一个if条件语句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条件
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');
实际上是让一个承诺排队以比较左边承诺的结果和右边的值