我有一个Selenium脚本,可以上传多个zip文件。这些zip文件的大小和持续时间在上传时会有所不同,生成的网页可能会显示错误,成功或只是继续等待上传完成。
我尝试使用显式等待来测试前两个条件中的任何一个是真的。脚本会暂停并等待一个或其他条件为真,但在moveOn()函数完成之后才会触发超时异常。例如,上传zip可能需要5分钟,我的功能将等待整个时间,但之后会引发超时超过30秒的错误。我期待超时在moveOn()函数内触发错误,所以我不确定我做错了什么。
我使用http://www.bizalgo.com/2012/01/14/timing-races-selenium-2-implicit-waits-explicit-waits/作为我试图做的事情的基础。
主叫代码:
try{
...
String click = "jq(\"a[title='Import']\").click();";
js.executeScript(click);
moveOn();
...
} catch (Exception e) {
System.out.println("Error in importing zip " + courseName + ". Exception:" + e);
}
我的explicitWait例程:
private void moveOn()
{
WebDriverWait wdw = new WebDriverWait(driver, 30);
ExpectedCondition<Boolean> condition = new ExpectedCondition<Boolean>()
{
@Override
public Boolean apply(WebDriver d)
{
Boolean error = false;
Boolean success = false;
//Look for error
WebElement result1 = d.findElement(By.className("wdkErrorGoBack"));
if( "Error".equals(result1.getText()))
{
error = true;
}
//Look for success
WebElement result2 = d.findElement(By.className("sbMainPageInstructions"));
if( "The content has been imported successfully.".equals(result2.getText()))
{
success = true;
}
//Return true if either are true
return (error || success);
}
};
//Wait until either condition is met or timeout expires
wdw.until(condition);
}
任何帮助将不胜感激。谢谢。
跟进: 我已经切换到executeAsyncScript,但我仍然无法让脚本在指定的时间内超时。
driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);
String ex = "cb = arguments[ arguments.length - 1 ];\n" +
"(function(){jq(\"a[title='Import']\").click();}());\n" +
"str=jq(this).find('.wdkErrorGoBack,.sbMainPageInstructions').eq(0).text();\n"+
"cb(str);";
System.out.println(ex);
Object response = js.executeAsyncScript(ex);
答案 0 :(得分:1)
我认为您看到的是这种行为,因为js.executeScript
是一个阻塞调用,就像driver.get
调用一样。代码每个示例等待5分钟这一事实表明了这一点。所以你的等待是在js执行完成后触发的。
至于在moveOn()
函数中触发的超时错误,我不太清楚我明白你的意思。根据设计,在等待30秒完成后将触发错误,因此在函数完成后将抛出错误。