【问题标题】:WebDriverWait timeout not being triggered until wait.until condition returns trueWebDriverWait 超时不会被触发,直到 wait.until 条件返回 true
【发布时间】:2015-01-15 10:44:33
【问题描述】:

我有一个上传多个 zip 文件的 Selenium 脚本。这些 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);
}

我的显式等待程序:

  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);

【问题讨论】:

    标签: selenium


    【解决方案1】:

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

    至于在moveOn() 函数中触发超时错误,我不太确定我理解你的意思。按照设计,错误会在等待 30 秒完成后触发,所以函数完成后会抛出错误。

    【讨论】:

    • 谢谢。我将不得不对 js.executeScript 的阻塞方面进行更多研究。 js.executeScript 只是单击一个按钮,通过 HTML POST 开始上传过程。 moveOn() 函数正在寻找两种可能的服务器响应。也许我应该把 js.executeScript 放在 moveOn() 函数中???回复:超时。在我的 WebDriverWait 实例中超时 30 秒,如果未完成,它应该在例程中引发错误 30.01 秒,对吗?但是,整个功能完成,文件上传,html绘制,然后引发超时错误。
    • 是的,等待条件30秒后应该抛出超时异常。这实际上取决于您的 JS 逻辑是如何为 POST 方法设置的。您可以尝试的一件事是异步执行脚本,这可能会让您立即进行控制。但问题真的是你到底想测试什么?上传一个大文件并确保在上传过程中发生超时错误,因为相应的状态消息不存在?
    • “上传一个大文件并确保在上传仍在进行时发生超时错误,因为相应的状态消息不存在?”是的,这正是我想要触发的。如果由于某种原因上传从未完成,我不想让脚本停留在此处而不继续上传下一个文件。
    • 如前所述,尝试使用js.executeAsyncScript 看看是否有帮助。它应该立即将控件返回给 moveOn 函数,超时将触发中上传。
    • 谢谢。我正在尝试它,它似乎做了我需要它做的事情。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 2015-05-01
    相关资源
    最近更新 更多