为什么在c#test类中,Selenium等待不再超时
我有一个使用WebDriverWait查找元素的小扩展方法为什么在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
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删除这个确实有效,我不知道为什么,如果你有一个解释或链接来解释它,那就太好了,但是你应该把你的评论改成一个答案,我会把它标记为正确的。