为什么在c#测试类中,硒等待不再超时

时间:2019-06-13 23:21:46

标签: c# selenium selenium-webdriver

我有一个小的扩展方法,可以使用WebDriverWait查找元素

public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }

它以前曾经可靠地工作过,但是不再正常工作。问题是超时不再适用。至少在对Web驱动程序的调用超时之前,它将一直无限期地查找。 这是一个C#测试程序,驱动程序是chrome驱动程序。通常使用XPath使用find来调用它,但是我们也使用其他find类型。 例如

var element = webDriver.FindElement(By.XPath(@"//h1[@class='m-t30'][contains(.,'My Profile')]"), 15);

任何想法为什么现在失败>

1 个答案:

答案 0 :(得分:1)

好的,您遇到的问题与ExplicitImplicit等待混合在一起。

让我解释一下。 Implicit等待会导致Selenium之类的动作ClickSendKeys等待给定的时间。例如300秒。

public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
    {
        if (timeoutInSeconds > 0)
        {
            var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
            return wait.Until(drv => drv.FindElement(by));
        }

        return driver.FindElement(by);
    }

给出您的代码,一行

return wait.Until(drv => drv.FindElement(by));

引起问题。

wait.Until首先运行,然后尝试调用findElement方法。然后Implicit等待到来,Selenium等待300秒,直到完成findElement操作为止。等待Explicit不会将其视为300秒。根据Selenium库中的注释,混合两者都有无法预料的结果。

根据我的经验,它看起来像这样的伪代码:

for (int i = 500ms; i < timeoutInSeconds; i+=500ms) {
    Thread.Sleep(300*1000) //300 seconds
    Driver.FindElement();

}

基本上就是这样对待它。隐式等待导致线程停止,因此对于给定的Thread.Sleep();显式等待中的计时器将被忽略。

在您的情况下,您使用了15秒的Explicit等待和300秒的Implicit等待。 默认池为每500毫秒。

基本上,您的等待将在以下期间起作用: 15 * 2 //调用方法FindElement的次数 在“查找元素”的每个隐式等待调用中,将其乘以秒数: 30 * 300秒。得出9000,得出150分钟。超过2小时。 这就是为什么您的代码被卡住并且Selenium超时的原因。

希望我能正确地向您解释。