我有一个小的扩展方法,可以使用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);
任何想法为什么现在失败>
答案 0 :(得分:1)
好的,您遇到的问题与Explicit
和Implicit
等待混合在一起。
让我解释一下。
Implicit
等待会导致Selenium之类的动作Click
或SendKeys
等待给定的时间。例如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超时的原因。
希望我能正确地向您解释。