.NET 硒 NoSuchElementException; WebDriverWait.Until() 不起作用
.NET Selenium NoSuchElementException; WebDriverWait.Until() doesn't work
我们有一个 .NET 4.5、MVC、C# 项目。我们正在使用 Selenium 进行 UI 测试,并且测试在我们拥有 wait.Until()
的行上不断失败。一个这样的例子是:
NoSuchElementException was unhandled by user code
An exception of type 'OpenQA.Selenium.NoSuchElementException' occurred in WebDriver.dll but was not handled in user code
Additional information: Unable to locate element: {"method":"css selector","selector":"#assessment-472 .status-PushedToSEAS"}
它就扔在这里:
Thread.Sleep(600);
wait.Until(drv => drv.FindElement(By.CssSelector("#" + assessmentQueueId + " .status-PushedToSEAS")));
我可以看到浏览器打开,我看到它到达那个点,我可以检查元素以查看该元素是否存在。它的id完全正确。
我们有这个问题很多,到目前为止,解决方案是在它前面抛出Thread.Sleep(600)
(或类似的时间)。 wait.Until()
的重点是不必这样做,这使我们的测试套件变得很长。另外,正如您在上面的示例中看到的,有时即使在它前面放了一个 Thread.Sleep()
之后我们也会遇到问题,我们必须延长时间。
为什么 .NET Selenium 的 WebDriver.Until()
不工作,有没有不同的方法来做同样的事情而不只是等待一段设定的时间?同样,问题是间歇性的,这意味着它只是有时发生,并且它可能发生在任意数量的 wait.Until()
个语句中,而不仅仅是显示的那个!
编辑:
这是一个 class 变量。
private WebDriverWait wait;
它是这样实例化的:
this.wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
我决定不使用 WebDriverWait.Until()
,而是在主驱动程序上使用隐式等待:
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
我完全感谢 this answer 在另一个问题上给我的想法。
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
try
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
catch
{
throw;
}
}
或者如果您
NoSuchElementException
试试这个代码
try
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)).Until(ExpectedConditions.ElementIsVisible(by));
}
return driver.FindElement(by);
}
catch(Exception e)
{
throw;
}
我们有一个 .NET 4.5、MVC、C# 项目。我们正在使用 Selenium 进行 UI 测试,并且测试在我们拥有 wait.Until()
的行上不断失败。一个这样的例子是:
NoSuchElementException was unhandled by user code
An exception of type 'OpenQA.Selenium.NoSuchElementException' occurred in WebDriver.dll but was not handled in user code
Additional information: Unable to locate element: {"method":"css selector","selector":"#assessment-472 .status-PushedToSEAS"}
它就扔在这里:
Thread.Sleep(600);
wait.Until(drv => drv.FindElement(By.CssSelector("#" + assessmentQueueId + " .status-PushedToSEAS")));
我可以看到浏览器打开,我看到它到达那个点,我可以检查元素以查看该元素是否存在。它的id完全正确。
我们有这个问题很多,到目前为止,解决方案是在它前面抛出Thread.Sleep(600)
(或类似的时间)。 wait.Until()
的重点是不必这样做,这使我们的测试套件变得很长。另外,正如您在上面的示例中看到的,有时即使在它前面放了一个 Thread.Sleep()
之后我们也会遇到问题,我们必须延长时间。
为什么 .NET Selenium 的 WebDriver.Until()
不工作,有没有不同的方法来做同样的事情而不只是等待一段设定的时间?同样,问题是间歇性的,这意味着它只是有时发生,并且它可能发生在任意数量的 wait.Until()
个语句中,而不仅仅是显示的那个!
编辑:
这是一个 class 变量。
private WebDriverWait wait;
它是这样实例化的:
this.wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
我决定不使用 WebDriverWait.Until()
,而是在主驱动程序上使用隐式等待:
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));
我完全感谢 this answer 在另一个问题上给我的想法。
public static IWebElement FindElement(this IWebDriver driver, By by, int timeoutInSeconds)
{
try
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds));
return wait.Until(drv => drv.FindElement(by));
}
return driver.FindElement(by);
}
catch
{
throw;
}
}
或者如果您
NoSuchElementException
试试这个代码
try
{
if (timeoutInSeconds > 0)
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeoutInSeconds)).Until(ExpectedConditions.ElementIsVisible(by));
}
return driver.FindElement(by);
}
catch(Exception e)
{
throw;
}