为什么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');
}
};
答案 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;
}
});