当应该使用 SetScriptTimeout 时,请提供任何示例。
我知道defn
Sets the amount of time to wait for an asynchronous script to finish execution before throwing an error. If the timeout is negative, then the script will be allowed to run indefinitely.
但不确定它到底做了什么。
答案 0 :(得分:6)
你已经有了两个答案,我没有找到解释清楚设置脚本超时的重点。
首先,脚本超时影响仅使用executeAsyncScript
和其他执行的JavaScript代码非常重要。特别是,executeScript
不受其影响。
那么为什么要为executeAsyncScript
设置超时? Chandan Nayak正确地解释了默认超时为0,因此如果要将executeAsyncScript
与实际执行某些工作的异步脚本一起使用,则必须更改此超时。但为什么不把它设置为-1
并完成呢?毕竟,如果将其设置为-1
,则关闭超时。所以你不会再有任何超时。任务完成了,对吗?不。
您要做的是将超时设置为一个值,该值允许您与executeAsyncScript
一起使用的代码执行,同时检测脚本何时流氓 。例如,如果从经验中知道您传递给executeAsyncScript
的脚本将在2秒或更短的时间内完成(除非在非常特殊的情况下),那么您将超时设置为2秒,以便在那里是某个地方的错误,代码永远不会终止,你会在2秒后超时。否则,Selenium会很乐意等待脚本完成。
答案 1 :(得分:2)
来自WebDriver文档:
setScriptTimeout
(很长一段时间,java.util.concurrent.TimeUnit单位)
设置在抛出错误之前等待asynchronous script
完成执行的时间。这对于Assync脚本(executeAsyncScript)有效only
让我们运行一个简单的javascript:(不要设置setScriptTimeout
) - 现在执行此操作时不会出现任何问题。
((JavascriptExecutor) driver).executeScript("alert('hello world');");
让我们运行一个简单的Assync脚本:(不要设置setScriptTimeout
) - 这将失败并显示错误 - “在0ms后等待异步脚本结果超时”
((JavascriptExecutor) driver).executeAsyncScript("window.setTimeout(arguments[arguments.length - 1], 500);");
要解决此问题: setScriptTimeout
至1秒:
driver.manage().timeouts().setScriptTimeout(1, TimeUnit.SECONDS);
然后运行上面提到的同一个Assync脚本,它将执行而不会出现任何错误。
<强>原因:强> 要执行的脚本的默认超时为0毫秒。在大多数情况下,包括下面的示例,必须事先将脚本超时WebDriver.Timeouts.setScriptTimeout(long,java.util.concurrent.TimeUnit)设置为足够大的值
更多参考链接:
When should setScriptTimeout be used?
WebDriver executeAsyncScript vs executeScript
WebDriver Doc
答案 2 :(得分:0)
Web应用程序自动化取决于许多因素,如浏览器,网络速度,嵌入式脚本等。要编写用于在所有环境中运行的健壮代码,我们需要在执行任何操作之前插入等待WebElements。
可以使用self = [UIButton buttonWithType:UIButtonTypeCustom];
或support.ui
如果我们使用driver().manage().timeouts()
,实现同步的常见做法是通过driver.manage().timeouts()
使用JavaScript,这反过来又为脚本执行提供了两种方法:
executeAsyncScript - &gt;此方法不会阻止下一行代码的执行......直到完成此方法的执行。此方法将执行,下一行代码将以异步方式执行。 (没有互相阻挡)
executeScript - &gt;此方法将阻止执行,直到执行完成,然后移动到下一行代码。简而言之,您的自动化代码将暂停,直到通过此方法执行Javascript。
现在,由于 executeAsyncScript 方法不会阻止下一行代码的执行,因此使用JavascriptExecutor
可能是有益的,这样我们的代码就可以等待指定的时间异步脚本在抛出错误之前完成执行。