当前位置: 首页 > 知识库问答 >
问题:

Selenium C#等待超时异常的最长时间

危烨煜
2023-03-14

Selenium C#在抛出超时异常之前等待的最大显式超时是多少?

有时我们正在测试的应用程序变得非常慢,最多需要4分钟才能加载。我想添加一个等待时间,这样它最多会等待5分钟。

我已经尝试过这个代码

WebDriverWait wait1 = new WebDriverWait(WebDriver, TimeSpan.FromMinutes(5));

wait1.Until(x => (bool)((IJavaScriptExecutor)x).ExecuteScript("returnjQuery.active==0"));

但是它在2分钟左右抛出超时异常。

共有2个答案

巫马浩言
2023-03-14

如果您使用<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(三种)类型的超时,如下所示:

  1. 会话脚本超时:指定等待脚本运行的时间。如果等于null,则会话脚本超时将是不确定的。否则为30,000毫秒。
  2. 会话页面加载超时:指定等待页面加载完成的时间。除非另有说明,否则为300,000毫秒。[document.readyState=="完成"]
  3. 会话隐式等待超时:指定在回退元素时以及在执行元素交互时等待元素变得可交互时,元素位置策略的等待时间(以毫秒为单位)。除非另有说明,否则为零毫秒。

如果在与一个元素(elementA,它调用一个< code>jQuery)进行交互之后,您需要等待一个< code>jQuery完成,以便与另一个元素(elementB)进行交互,那么您提到的函数就符合这个要求。

当您在加载 URL 时寻找 5 分钟后超时的解决方案时,默认情况下,它已通过会话页面加载超时实现,值为 300,000 毫秒5 分钟。

毋宸
2023-03-14

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