WebDriver: Как проверить наличие текста на странице (C#)

Работа с текстом одна из часто встречаемых задач при автоматизации тестирования веб-приложений. В этой заметке примеры методов ожидания и проверки наличия текста на странице.

Для поиска текста на странице я использую стандартный метод WebDriver-а FindElement по XPath локатору "//*[contains(text(),'" + text + "')]". Нам нужно проверить, не только, что данный элемент присутствует в DOM-модели страницы, но и что он доступен пользователю. Поэтому будем использовать свойство элемента Displayed. Это свойство WebDriver элемента проверяет атрибут элемента страницы displayed. Пример метода IsTextPresent:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
        public bool IsTextPresent(string text)
        {
            Trace.WriteLine("Is the page contains the text '" + text + "'", "Document");
 
            try
            {
                return _driver.FindElement(By.XPath("//*[contains(text(),'" + text + "')]")).Displayed;
            }
            catch (WebDriverException)
            {
                Trace.WriteLine("The page is not contains the text '" + text + "'", "Document");
                return false;
            }
        }
        public bool IsTextPresent(string text)
        {
            Trace.WriteLine("Is the page contains the text '" + text + "'", "Document");

            try
            {
                return _driver.FindElement(By.XPath("//*[contains(text(),'" + text + "')]")).Displayed;
            }
            catch (WebDriverException)
            {
                Trace.WriteLine("The page is not contains the text '" + text + "'", "Document");
                return false;
            }
        }

С помощью метода Count WebElement-а можно получить количество найденных текстовых элементов на странице.

1
        _driver.FindElements(By.XPath("//*[contains(text(),'" + text + "')]")).Count;
        _driver.FindElements(By.XPath("//*[contains(text(),'" + text + "')]")).Count;

Не рекомендую использовать метод PageSource() для поиска текста, так как он не учитывает свойств доступности текста для пользователя. Но возможно, он пригодится для других целей. Пример:

1
        _driver.PageSource().Сontains("text so search");
        _driver.PageSource().Сontains("text so search");

Перед тем как проверить наличие текста, нам нужно дождаться его появления на странице. Чтобы не получить ложных результатов. Для ожидания будем использовать класс WebDriverWait. В качестве условия IsTextPresent (смотри пример выше). Пример реализации метода ожидания появления текста на странице:

1
2
3
4
5
6
        public void WaitForTextPresent(string text)
        {
            Trace.WriteLine("Wait for the text '" + text + "' is present", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(drv => IsTextPresent(text));
        }
        public void WaitForTextPresent(string text)
        {
            Trace.WriteLine("Wait for the text '" + text + "' is present", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(drv => IsTextPresent(text));
        }

Иногда нам нужно дожидаться, пока элемент исчезнет со страницы.

1
2
3
4
5
6
        public void WaitForTextDisappear(string text)
        {
            Trace.WriteLine("Wait for the text '" + text + "' is disappear", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(drv => !IsTextPresent(text));
        }
        public void WaitForTextDisappear(string text)
        {
            Trace.WriteLine("Wait for the text '" + text + "' is disappear", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(drv => !IsTextPresent(text));
        }

Методы WaitForTextPresent и WaitForTextDisappear в данной реализации, по сути, являются аналогами методов AssertIsTextPresent и AssertIsTextNotPresent. Результат будет идентичен. Я все же использую методы Assert для большой наглядности и с целью разделения их логических функций, хотя это и избыточно.

Метод AssertIsTextPresent содержит метод ожидания текста и метод NUnit Assert.IsTrue, который в качестве параметра принимает IsTextPresent(text). В данном примере Assert не обязателен, т.к. эту роль выполняет WaitForTextPresent.

1
2
3
4
5
6
        public void AssertIsTextPresent(string text)
        {
            Trace.WriteLine("Assert is the page contains the text '" + text + "'", "Document");
            WaitForTextPresent(text);
            Assert.IsTrue(IsTextPresent(text), "Error! Text '" + text + "' is not present on the page");
        }
        public void AssertIsTextPresent(string text)
        {
            Trace.WriteLine("Assert is the page contains the text '" + text + "'", "Document");
            WaitForTextPresent(text);
            Assert.IsTrue(IsTextPresent(text), "Error! Text '" + text + "' is not present on the page");
        }

Пример метода AssertIsTextNotPresent

1
2
3
4
5
        public void AssertIsTextNotPresent(string text)
        {
            Trace.WriteLine("Assert is the page NOT contains the text: '" + text + "'", "Document");
            Assert.IsFalse(IsTextPresent(text), "Error! Text '" + text + "' is present on the page");
        }
        public void AssertIsTextNotPresent(string text)
        {
            Trace.WriteLine("Assert is the page NOT contains the text: '" + text + "'", "Document");
            Assert.IsFalse(IsTextPresent(text), "Error! Text '" + text + "' is present on the page");
        }

В этом примере метод WaitForTextPresent не вызывается, т.к. в данном случает он точно избыточен.