Watir находит элемент по xpath, но не по id или классу
Я могу найти элемент, используя его XPath, но не используя его идентификатор, класс или текст. Я не хочу использовать XPath, потому что знаю, что он легко сломается.
Вот как это выглядит:
$browser.div(:xpath => "/html/body/nav/div[1]/div/div[3]/div/div/div[3]/div/div/div[2]/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div").present?
$browser.div(:xpath => "/html/body/nav/div[1]/div/div[3]/div/div/div[3]/div/div/div[2]/div[1]/div/div[2]/div[2]/div[1]/div[2]/div/div/div").click
Возвращает true и нажимает на элемент.
Следуя пути, я нахожу элемент, затем попробуйте использовать его идентификатор, например:
$browser.div(:id => "PaymentSelector").present?
$browser.div(:id => "PaymentSelector").click
Он возвращает ложь и время ожидания, пытаясь нажать. То же самое происходит с текстом или классом.
Элемент не находится внутри фрейма или фрейма.
Почему это произошло и как мне это исправить?
1 ответ
Как обсуждалось в комментариях, проблема в том, что есть несколько элементов с одинаковым идентификатором. Это можно увидеть по телефону:
$browser.divs(:id => "PaymentSelector").count
#=> 5
Watir возвращает первый соответствующий элемент, который в данном случае оказывается скрытым элементом. Это не тот, который интересует пользователя. Вам нужно создать более конкретный локатор, чтобы возвращался нужный элемент.
Один из вариантов - указать :index
так как теперь вы знаете, что это второй:
$browser.div(:id => "PaymentSelector", :index => 2).click
Однако, вероятно, будет более надежным просто найти первый видимый, используя :visible
локатор:
$browser.div(:id => "PaymentSelector", :visible => true).click