如何等待WebElement具有特定的文本值(Selenium C#)

时间:2018-04-07 02:35:23

标签: c# selenium selenium-webdriver webdriver

我知道我可以通过这样做等待存在的元素:

var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(5));
var element = wait.Until(d => d.FindElement(By.Id("foo-status")));

如果它在5秒内不存在,则element为空。

如何让Selenium等待元素具有某个文本值?

(我已回答了我自己的问题,但会热衷于任何更好的答案或改进。)

2 个答案:

答案 0 :(得分:1)

ExpectedConditions的帮助下,您可以使用TextToBePresentInElement的方法实现一个更简单的解决方案,让您的用例等待元素拥有某个文本,如下所示:

wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
var expectedText = "good";
var element = wait.Until(ExpectedConditions.TextToBePresentInElement(By.Id("foo-status"), expectedText));

答案 1 :(得分:0)

诀窍是使用一个过滤方法,如果文本不匹配则返回null。

public static IWebElement ElementTextFilter(IWebElement webElement, string text) {
    if (webElement == null)
        return null;

    return webElement.Text.Equals(text, StringComparison.OrdinalIgnoreCase)
        ? webElement : null;
}

// ...

var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(5));
var expectedText = "good";
var element = wait.Until(d =>
    ElementTextFilter(d.FindElement(By.Id("foo-status")), expectedText)
);

可以轻松将其转换为更清洁的扩展方法。

public static class WebElementExtensions {
    public static IWebElement WithText(this IWebElement webElement, string text) {
        if (webElement == null)
            return null;

        return webElement.Text.Equals(text, StringComparison.OrdinalIgnoreCase)
            ? webElement : null;
    }

// ...

var wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(5));
var expectedText = "good";
var element = wait.Until(d => d.FindElement(By.Id("foo-status")).WithText(expectedText));