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

时间:2017-09-04 07:08:08

标签: c# selenium selenium-webdriver webdriver

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

有时我们测试的应用程序变得非常慢并且需要最多4分钟才能加载。我想添加一个等待时间,以便最多等待5分钟。

我尝试过这段代码

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

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

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

2 个答案:

答案 0 :(得分:0)

Webdriver有隐藏和等待等待的方法,但是当页面加载时间太长时,它不会有用。此外,当流程中发生异常或错误时,尽管页面已经加载,但我们最终会在“指定”时间内不必要地等待,并且在剩余的时间段内不会发生任何变化。

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/

请参阅下面的

How to make Selenium WebDriver wait for page to load when new page is loaded via JS event

希望它会对你有所帮助:)。

答案 1 :(得分:0)

如果您在页面加载时使用ExplicitWaitWebDriverWait,请直接回答:

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

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

IMO,这是一个开销。

值得一提的是,一旦您的脚本开始加载网址,默认情况下,浏览器客户端会返回 document.readyState === "complete" 。然后只执行下一行代码。

页面加载:

现在让我对此有所了解。使用Selenium,默认情况下,实现3(3)种超时类型:

  1. session script timeout:指定等待脚本运行的时间。如果等于null,则会话脚本超时将是无限期的。否则它是30,000毫秒。
  2. session page load timeout:指定等待页面加载完成的时间。除非另有说明,否则为300,000毫秒。 [<强> document.readyState === "complete"
  3. session implicit wait timeout:指定在检索元素时以及在执行元素交互时等待元素变得可交互时元素位置策略等待的时间(以毫秒为单位)。除非另有说明,否则为零毫秒。
  4. 元素加载:

    如果与元素(elementA,调用 jQuery )进行交互后,您需要等待 jQuery 完成了另一个可以互动的元素(elementB),你提到的功能符合要求。

    结论:

    由于您正在寻找加载网址5分钟后暂停的解决方案,因此默认情况下已通过 session page load timeout 实施,其值为 300,000 milliseconds 5 分钟。