在wait.until条件返回true之前,不会触发WebDriverWait超时

时间:2015-01-12 01:29:57

标签: selenium

我有一个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);

1 个答案:

答案 0 :(得分:1)

我认为您看到的是这种行为,因为js.executeScript是一个阻塞调用,就像driver.get调用一样。代码每个示例等待5分钟这一事实表明了这一点。所以你的等待是在js执行完成后触发的。

至于在moveOn()函数中触发的超时错误,我不太清楚我明白你的意思。根据设计,在等待30秒完成后将触发错误,因此在函数完成后将抛出错误。