nodetree

Данная запись будет посвящена (как можно догадаться из заголовка) webdriver и случайным образом возникающей ошибке: Element is no longer attached to the DOM. Вашим скриптам она более известна как: StaleElementReferenceException .

Причины для возникновения этой ошибки могут быть следующие:

  • Вы пытаетесь выполнить действие на элементе, который когда-то нашли. Но это уже совсем другой элемент (хотя в браузере он может выглядеть так же). Или вообще другая страница. Или иное измерение. =)
  • Вебдрайвер нашёл элемент, но в момент обращения к нему Java Script сценарий изменил его или DOM страницы. Такое бывает когда на странице могут выполняться AJAX  запросы.
  • Элемент был найден до полной загрузки страницы, а затем пересоздан.

Вообщем, все сводятся к одному: Ваши  авто-тесты плохо написаны! И самое время их отрефакторить.

Cделать это можно несколькими разными способами:

  • Включить неявное ожидание:
    Данная строчка кода говорит опрашивать DOM в течении выставленного времени, в случае если сразу же c элементом какие-то проблемы. Время ожидание выставляется один раз и актуально пока существует данный объект драйвера.
  • Обернуть проблемное место в try-catch блок:
    Лично я такой вариант не советую ни в коем случае! У вас будет только ещё одна попытка найти элемент и она тоже может быть провальной. С перехватыванием данной ошибки куда лучше подойдёт следующий вариант в духе ООП.
  • Создание декоратора(обёртки) вокруг проблемных WebElement’ов:
    По мне, так просто и со вкусом.
  • Ну и напоследок. Создание ожидания появления элемента с помощью WebDriverWait:
    Советую ознакомится с этим хитрым колдовством по-подробнее. Начать можно ОТСЮДА. Ну а ТУТ уже готовые ожидаемые условия на все случаи жизни. И сразу же небольшой пример с оф. сайта:

Да прибудет с вами дух машины, автоматизаторы!

 

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс