четверг, 2 октября 2014 г.

Selenium: как установить время поиска элемента или неявные ожидания

Selenium WebDriver передает управление сразу после выполнения команды, не дожидаясь какого-либо результата своих действий. То есть если Вы выполните клик по ссылке, а потом поиск элемента на странице, находящейся по этой ссылке, то Selenium не будет ждать загрузки страницы после клика, а сразу начнет поиск. Выглядит так, что этот механизм не должен работать, ведь страница еще не загрузилась и тест упадет, но по факту это работает благодаря механизму неявных ожиданий (implicit wait). WebDriver будет искать новый элемент в течение какого-то установленого времени (по умолчанию обычно 60 секунд), это не значит, что он просто подождет минуту и потом пойдет искать элемент. Это значит, что в течение 60 секунд с определенной периодичностью драйвер будет выполнять поиск элемента и только если за все это время найти элемент не удастся он упадет с ошибкой NoSuchElementException.
Методы findElement и findElements асинхронные, чтобы включить для них механизм неявного ожидания можно выполнить следующую команду:

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

После выполнения этой команды методы findElement и findElements будут пытаться найти элемент в течение 10 секунд и если ему это не удастся, выбросит исключение NoSuchElementException.

Величину implicitlyWait таймаута стоит выбирать осмысленно, слишком маленькое значение может привести к тому, что тесты будут падать просто потому что не дождались загрузки страницы. Слишком большое значение приведет к тому, что при некорректной работе приложения тесты будут слишком долго стоять в надежде найти таки этот несуществующий элемент и общее время выполнения тестов увеличится.

Если поставить значение implicitlyWait  переменной равное нулю, то веб драйвер попытается найти элемент один раз и в случае неудачи сразу выбросить исключение. Это может быть уместно, если, например, у Вас в коде уже отрабатывают методы по ожиданию полной загрузки страницы. В таком случае смысла ждать еще и внутри методов поиска элемента уже нет.

Итак, механизм неявных ожиданий (implicity waits) позволяет определить таймаут, в течение которого Selenium WebDriver  будет осуществлять поиск элемента.элементов.