2

我想在 ac# 项目中使用 waitforcondition Selenium 扩展。我在论坛上看到人们添加: selenium.waitForCondition("some_javascript_boolean_test_as_a_string", "5000")

由于命名空间“Selenium”中不存在“WaitForCondition”,如何将其添加到 C# 项目?

编辑: 我想检查两个条件。首先加载两个元素,假设 id=el1 和 id=el2 的元素。之后,从 DOM 中删除元素 el2 之一。删除 el2 后,立即加载页面。

4

2 回答 2

3

您正在使用 WebDriver(从您之前的 Selenium 问题中得到),因此您看到的代码不正确。selenium.waitForCondition是旧的 v1 代码。您正在使用漂亮的新闪亮 v2 代码。

您需要的是位于命名空间中的WebDriverWaitOpenQA.Selenium.Support类。

var driver = new FirefoxDriver();
var waitableDriver = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
var element = waitableDriver.Until(d => d.FindElement(By.Id("something")));

这将等到它找到某个元素。但是,它允许您指定 any Func<T, TResult>,因此它提供了很大的灵活性空间。您可以在 C# 中利用 lambda 的强大功能。

如果您想等待一个元素对用户可见在其中包含一个值怎么办?如果登录时有一条消息在 5 秒后弹出怎么办?都是可行的。

此外,还有一些方便的“预期条件”已经准备好供您使用,这些是人们可能需要“等待”特定条件为真的常见情况,例如,普通人需要等到元素不仅在页面中呈现,而且对用户实际可见。有一个ElementIsVisible预期的条件供您使用,因此您不必手动编写逻辑。

这整个概念在 Selenium 世界中被称为显式等待,对于自动化 AJAX 化应用程序的测试至关重要。

于 2013-05-28T17:20:04.147 回答
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;
                }
            });
于 2013-05-29T11:32:47.307 回答