WebDriver: Ожидание загрузки страницы (C#)

Loading В Selenium RC есть универсальный метод WaitForPageToLoad, который дожидается момента загрузки страницы. В Selenium WebDriver подобного метода не предусмотрено. Эта задача в WebDriver решается с помощью механизма явных ожиданий. Подход разработчиков этого инструмента вполне очевиден, т.к. в современных асинхронных приложениях не всегда понятно, когда наступает момент полной загрузки страницы. Не понятно, какого события ожидать. Вполне возможно, что полной загрузки страницы может и вовсе не произойти из-за динамического обновления определенных блоков страницы и real time событий. Идеология WebDriver-а заключается в использовании явных ожиданий: жди, пока появится конкретный элемент или наступит конкретное событие -> выполни действие -> жди пока …

Но при создании тестов хочется иметь некоторый более-менее универсальный метод ожидания загрузки страницы. У каждой страницы есть заголовок (title) которого мы можем дожидаться. Это ожидание не гарантирует нам, что страница полностью загрузилась, но оно нам даст понять, что загрузилась страница с ожидаемым нами title. И, что она, скорее всего, готова для работы. Дальнейшие ожидания уже нужно затачивать под конкретное приложение и тесты. Далее примеры метода получения заголовка страницы и методы ожидания заголовка.

Получаем заголовок текущего окна браузера.

1
2
3
4
5
6
7
8
9
        public string GetTitle
        {
            get
            {
                var title = _driver.Title;
                Trace.WriteLine("Get the title of the current browser window. Title is: '" + title + "'", "Document");
                return title;
            }
        }
        public string GetTitle
        {
            get
            {
                var title = _driver.Title;
                Trace.WriteLine("Get the title of the current browser window. Title is: '" + title + "'", "Document");
                return title;
            }
        }

Для ожиданий будем использовать класс WebDriverWait. Пример метода ожидания появления конкретного заголовка страницы:

1
2
3
4
5
6
        public void WaitForTitle(string title)
        {
            Trace.WriteLine("Wait for the title of the page is present", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(ExpectedConditions.TitleIs(title));
        }
        public void WaitForTitle(string title)
        {
            Trace.WriteLine("Wait for the title of the page is present", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(ExpectedConditions.TitleIs(title));
        }

Некоторые страницы имеют динамические заголовки, поэтому мы должны предусмотреть ожидание по частичному совпадению заголовка. Для этого используем условие TitleContains:

1
2
3
4
5
6
        public void WaitForTitleWhichContains(string title)
        {
            Trace.WriteLine("Wait for the title of the page is present", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(ExpectedConditions.TitleContains(title));
        }
        public void WaitForTitleWhichContains(string title)
        {
            Trace.WriteLine("Wait for the title of the page is present", "Document");
            var wait = new WebDriverWait(_driver, TimeSpan.FromMilliseconds(Config.WaitForTimeout));
            wait.Until(ExpectedConditions.TitleContains(title));
        }