要添加到@雅立的回答,我已经提出了一些扩展方法有助于消除竞争条件。
这是我的设置:
我有一个叫做“Driver.cs”的类。它包含一个充满驱动程序扩展方法和其他有用静态函数的静态类。
对于元素我通常需要检索,我创建像一个扩展方法如下:
public static IWebElement SpecificElementToGet(this IWebDriver driver) {
return driver.FindElement(By.SomeSelector("SelectorText"));
}
这可以让你从任何测试类检索元素与代码:
driver.SpecificElementToGet();
现在,如果这导致StaleElementReferenceException
,我在我的驱动程序类中有以下静态方法:
public static void WaitForDisplayed(Func<IWebElement> getWebElement, int timeOut)
{
for (int second = 0; ; second++)
{
if (second >= timeOut) Assert.Fail("timeout");
try
{
if (getWebElement().Displayed) break;
}
catch (Exception)
{ }
Thread.Sleep(1000);
}
}
该函数的第一个参数是返回IWebElement对象的任何函数。第二个参数是以秒为单位的超时(超时代码是从Selenium IDE for FireFox中复制的)。该代码可以用于避免陈旧元件例外以下方式:
MyTestDriver.WaitForDisplayed(driver.SpecificElementToGet,5);
上面的代码将调用driver.SpecificElementToGet().Displayed
直到driver.SpecificElementToGet()
没有抛出异常和.Displayed
评估为true
5秒没有通过。 5秒后,测试将失败。
在另一面,等待一个元素不存在,你可以使用下面的函数一样:
public static void WaitForNotPresent(Func<IWebElement> getWebElement, int timeOut) {
for (int second = 0;; second++) {
if (second >= timeOut) Assert.Fail("timeout");
try
{
if (!getWebElement().Displayed) break;
}
catch (ElementNotVisibleException) { break; }
catch (NoSuchElementException) { break; }
catch (StaleElementReferenceException) { break; }
catch (Exception)
{ }
Thread.Sleep(1000);
}
}
希望17k的意见表明,它不只是你;)这已成为最令人沮丧的Selenium例外。 – 2013-06-12 04:45:49
48k吧!我有同样的问题... – Gal 2015-06-25 04:22:09
我发现硒是纯粹的,完整的垃圾.... – 2015-10-29 20:44:05