Selenium C#在抛出超时异常之前等待的最大显式超时是多少?
有时我们正在测试的应用程序变得非常慢,最多需要4分钟才能加载。我想添加一个等待时间,这样它最多会等待5分钟。
我已经尝试过这个代码
WebDriverWait wait1 = new WebDriverWait(WebDriver, TimeSpan.FromMinutes(5));
wait1.Until(x => (bool)((IJavaScriptExecutor)x).ExecuteScript("returnjQuery.active==0"));
但是它在2分钟左右抛出超时异常。
如果您使用<code>ExplicitWait
WebDriverWait wait1 = new WebDriverWait(WebDriver, TimeSpan.FromMinutes(5));
wait1.Until(x => (bool)((IJavaScriptExecutor)x).ExecuteScript("returnjQuery.active==0"));
国际海事组织,这是一个开销。
值得一提的是,一旦您的脚本开始加载 URL,默认情况下,浏览器客户端将返回 document.readyState === “完成”
。然后只执行下一行代码。
现在让我具体一点。使用Selenium,默认情况下实现3(三种)类型的超时,如下所示:
会话脚本超时
:指定等待脚本运行的时间。如果等于null,则会话脚本超时将是不确定的。否则为30,000毫秒。会话页面加载超时
:指定等待页面加载完成的时间。除非另有说明,否则为300,000毫秒。[document.readyState=="完成"
]会话隐式等待超时
:指定在回退元素时以及在执行元素交互时等待元素变得可交互时,元素位置策略的等待时间(以毫秒为单位)。除非另有说明,否则为零毫秒。如果在与一个元素(elementA,它调用一个< code>jQuery)进行交互之后,您需要等待一个< code>jQuery完成,以便与另一个元素(elementB)进行交互,那么您提到的函数就符合这个要求。
当您在加载 URL 时寻找 5 分钟后超时的解决方案时,默认情况下,它已通过会话页面加载超时
实现,值为 300,000 毫秒
或 5
分钟。
Webdriver有隐式和exlict等待的方法,但当页面加载时间太长时,这种方法不会有用。此外,当流中发生异常或错误时,我们会不必要地等待“指定”时间,尽管页面已经加载,并且在剩余时间段内不会发生任何更改。
Webdriver API的限制之一是不支持开箱即用的WaitForPageLoad。但是我们可以使用WebDriverWait类和DOM的readyState属性来实现。
WebDriverWait
可以等待元素。我担心WebDriverWait
不能直接在JavaScriptExecutor
上工作。你需要处理下面这样的事情
您可以等到文档处于就绪状态。
string state = string.Empty;
state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
完整代码如下所示
public void WaitForPageLoad(int maxWaitTimeInSeconds) {
string state = string.Empty;
try {
WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(maxWaitTimeInSeconds));
//Checks every 500 ms whether predicate returns true if returns exit otherwise keep trying till it returns ture
wait.Until(d = > {
try {
state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
} catch (InvalidOperationException) {
//Ignore
} catch (NoSuchWindowException) {
//when popup is closed, switch to last windows
_driver.SwitchTo().Window(_driver.WindowHandles.Last());
}
//In IE7 there are chances we may get state as loaded instead of complete
return (state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase));
});
} catch (TimeoutException) {
//sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls
if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase))
throw;
} catch (NullReferenceException) {
//sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls
if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase))
throw;
} catch (WebDriverException) {
if (_driver.WindowHandles.Count == 1) {
_driver.SwitchTo().Window(_driver.WindowHandles[0]);
}
state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
if (!(state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase)))
throw;
}
}
来源:-
https://automationoverflow.wordpress.com/2013/07/27/waiting-for-page-load-to-complete/
请参考以下内容
如何使硒网络驱动程序等待页面加载,当通过JS事件加载新页面时
希望对你有帮助:)
问题内容: 我使用Node.js和TypeScript,并且使用。这是我的测试用例: 我想为整个功能设置一个超时时间。即如果要花费2秒,花费0.5秒,花费5秒,我想在3秒钟后让我抛出错误的超时。 正常调用是一个问题,因为范围丢失了: 而且我不能用普通的方式抓住它: 有关如何解决的任何想法? 问题答案: 您可以使用超时: 您必须将其包装在诺言中才能使用。
问题内容: 更新记录时,我反复出现锁定超时超出异常的情况。 我正在使用Java Struts 2.1 Hibernate配置。使用的数据库是MYSQL。 任何人都知道如何解决它。 问题答案: 这里有一些建议: “ 锁定等待超时 ”通常发生在事务正在等待要更新的数据行上,而该行已被某些其他事务锁定时。 在大多数情况下,问题出在数据库方面。可能的原因可能是表格设计不当,数据量大,约束等。 请查看这个详
在Bash脚本中,我想做如下操作: 一、 例如,在后台启动两个应用程序,并给他们60秒时间完成工作。然后,如果他们没有在这段时间内完成,就杀了他们。 不幸的是,上面的方法行不通,因为< code>timeout是一个可执行文件,而< code>wait是一个shell命令。我试着把它改成: 但是这仍然不起作用,因为< code>wait只能在同一个shell中启动的PID上调用。 有什么想法吗?
问题内容: 我想知道WebDriver等待超时和隐式等待超时之间的技术差异。 问题答案: 如文档中所述: 在内部设置将用于所有连续搜索的超时。如果找不到该元素,它将尝试在指定的时间内反复查找该元素。它仅执行此操作,不能强制执行其他任何操作- 它等待元素显示。 ,或者只是您用于特定搜索的一次计时器。它具有更大的可扩展性,意味着您可以将其设置为等待可能需要的任何条件。通常,您可以使用一些预构建的元素来
问题内容: 具有以下等待声明: 它可能会因InterruptedException或超时而退出,或者由于Notify / NotifyAll方法是在另一个线程中调用而退出的,因此异常很容易捕获,但是… 有什么方法可以知道退出原因是超时还是通知? 编辑: 这是一种可行的技巧,(尽管我不喜欢) 问题答案: 除非您提供一些其他代码,否则您无法区分两者。例如,添加添加 为仅设置为的 但是首先,您必须确保您
问题内容: 在Bash脚本中,我想执行以下操作: 即,在后台启动两个应用程序,并给它们60秒以完成其工作。然后,如果他们没有在该时间间隔内完成,请杀死他们。 不幸的是,上述内容不起作用,因为它是可执行文件,而它是Shell命令。我尝试将其更改为: 但这仍然行不通,因为只能在同一外壳程序内启动的PID上进行调用。 有任何想法吗? 问题答案: 将PID写入文件并像这样启动应用程序: 这将创建另一个hi