Как я могу заставить Ватира сделать свежую ссылку на нестарший элемент?
Часть некоторых тестов, которые я пишу, призывает к проверке, удаляется ли опция из списка выбора после ее использования. Я непоследовательно получаю эту ошибку:истекло время ожидания через 60 секунд, ожидая, что {:xpath=>"//select[@id = 'newIdentifierType']//option",:index=>31} будет расположен (Watir:: Исключение::UnknownObjectException)
Это приводит к тому, что мой тест проваливается, может быть, 2-3 раза из 10 запусков, и кажется случайным. Я думаю, что Watir ищет "старый" список выбора с этим идентификатором, поскольку он кэширует элемент и может также включать в себя, что в нем было 32 элемента, но время ожидания истекло, поскольку список выбора с этим идентификатором и 32 элементами больше не существует. Новый список выбора имеет тот же идентификатор, но только 31 элемент.
Есть ли способ всегда получить новую ссылку на этот элемент, даже если он технически не устарел? Я испытываю эту проблему из-за другой проблемы?
Мой текущий код для получения опций в списке выбора:@browser.elements(:xpath => "//select[@id = 'newIdentifierType']//option")
Я использую Ruby/Cucumber с уровнем Selenium и Watir Webdriver. Сначала я попытался определить элемент как select_list в объекте страницы, но переместил его в определения шагов, используя @ browser.element, чтобы посмотреть, остановит ли это тайм-аут. Я думал, что он может игнорировать кэшированные элементы Watir и получить самый последний элемент с идентификатором, но это не так.
1 ответ
Пожалуйста, избегайте использования XPath с Watir. Все, что вы можете делать с XPath, Watir имеет гораздо более удобочитаемый API для обработки.
Чтобы проверить, нет ли определенной опции, вам следует избегать коллекций и размещать непосредственно:
el = browser.select_list(id: "newIdentifierType").option(value: "31"))
# or
el = browser.select_list(id: "newIdentifierType").option(text: "This one"))
Тогда, чтобы видеть, ушло ли это:
el.stale?
# or
el.wait_until(:stale?)
Это не будет проверять правильность, если весь DOM изменился, поэтому вам, возможно, придется просто переместить:
browser.select_list(id: "newIdentifierType").option(text: "This one")).present?
Если вы намереваетесь использовать коллекцию, правильный способ получить список параметров:
options = @browser.select(id: 'newIdentifierType').options
el = options.find { |o| o.text == 'This one' }
# Do things
el.stale?