我想在c#项目中使用waitforcondition Selenium扩展。 我在论坛上看到人们补充道: selenium.waitForCondition(“some_javascript_boolean_test_as_a_string”,“5000”)
我怎样才能将它添加到C#项目中,因为命名空间'Selenium'中不存在'WaitForCondition'?
修改 我想检查两个条件。首先加载两个元素,让我们说id = el1和id = el2的元素。之后,从DOM中删除一个元素el2。删除el2后,页面就会被加载。
答案 0 :(得分:3)
您正在使用WebDriver(从之前的Selenium问题中得到),因此您看到的代码不正确。 selenium.waitForCondition
是旧的v1代码。您正在使用漂亮的新闪亮v2代码。
您想要的是OpenQA.Selenium.Support
命名空间中的WebDriverWait类。
var driver = new FirefoxDriver();
var waitableDriver = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var element = waitableDriver.Until(d => d.FindElement(By.Id("something")));
这会等到找到某个元素。但是,它允许您指定任何Func<T, TResult>
,因此它提供了一些灵活性的空间。你可以在C#中利用lambdas的力量。
如果您想等待某个元素对用户可见并且在其中有值,该怎么办?如果您在5秒后弹出登录时有消息怎么办?一切皆宜。
此外,还有一些方便的'expected conditions'已经可供您使用,这些是人们可能需要“等待”特定情况才能成为常见的常见情况,例如,这是普通人需要的等待元素不仅在页面中呈现,而且实际上对用户可见。您可以使用ElementIsVisible
预期条件,因此您无需手动编写逻辑。
这个概念在Selenium世界中被称为explicit waits,对于自动测试AJAX的应用程序至关重要。
答案 1 :(得分:0)
通过设置WebDriverWait等待bool值而不是IWebElement,我找到了等待条件成立的方法:
waitableDriver.Until<bool>((d) =>
{
try
{
IWebElement elementOverlay = d.FindElement(By.Id("overlay"));
return !elementOverlay.Displayed;
}
catch (NoSuchElementException)
{
IWebElement element = d.FindElement(By.XPath("//li[@id='newBtn']"));
return true;
}
});