Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在c#test类中,Selenium等待不再超时_C#_Selenium_Selenium Webdriver - Fatal编程技术网

为什么在c#test类中,Selenium等待不再超时

为什么在c#test类中,Selenium等待不再超时,c#,selenium,selenium-webdriver,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(timeou

我有一个使用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查找来调用,但我们也使用其他查找类型。 比如说

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

你知道为什么现在失败了吗好吧,你的问题是混合了显式和隐式等待

让我解释一下。
Implicit
wait会导致Selenium的
单击
发送键
等操作等待给定的时间。例如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
操作完成<代码>显式< /代码>等待不认为它是300秒。根据Selenium图书馆中的评论,两者混合会产生不可预测的结果

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

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

}
for(int i=500ms;i
基本上就是这样处理的。隐式等待导致线程停止,因此对于给定的线程,显式等待中的计时器被忽略。Sleep()

在您的例子中,您使用了15秒的
显式
等待和300秒的
隐式
等待。 默认池是每500毫秒一次

基本上,您的等待在以下时间有效: 15*2//调用方法
FindElement
的次数 将其乘以来自Find元素的每个隐式等待调用中的秒数: 30*300秒。那就是9000分钟,也就是150分钟。两个多小时了。 这就是为什么您的代码被卡住并且Selenium超时的原因


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

当您调试时,
timeoutingseconds
的值是多少?您是否在代码中的某个地方设置了
implicitWait
?是的,我昨天看到了,我不确定为什么会这样做。WebDriver.Manage().Timeouts().ImplicitWait=TimeSpan.FromSeconds(300);或者为什么这么长。我们还处于了解其工作原理的早期阶段。@mjwills超时如预期,在上面的示例中为15seconds@Fenio删除这个确实有效,我不知道为什么,如果你有一个解释或链接来解释它,那就太好了,但是你应该把你的评论改成一个答案,我会把它标记为正确的。