Среди всех элементов, с которыми мы взаимодействуем через Selenium WebDriver
одним из самых сложных является элемент Select
.
Его нельзя просто так найти и кликнуть/заполнить.
Хочу поделиться своим рецептом работы с ним.
def select options
# как искать select (меню)
# :class, :class_name, :id, :link_text, :link, :partial_link_text, :name, :tag_name, :xpath
# :xpath по умолчанию
how = options[:how] || :xpath
# что искать
# например, '/html/body/select'
what = options[:what]
# какой option (пункт) выбрать
# если не указано, то будет выбран случайный пункт (часто нужно)
value = options[:value]
# объект Selenium::WebDriver::Wait
# можно не указывать
wait = options[:wait] || Selenium::WebDriver::Wait.new
# no comments
driver = options[:driver]
# ждём, когда элемент появится на странице
wait.until do
select = driver.find_element how, what
select.find_elements :tag_name, 'option'
end
# ищем select
select = driver.find_element how, what
# ищем options
options = select.find_elements :tag_name, 'option'
# выбираем случайный option из select
random = options.sample.attribute 'value'
# определяем, какой именно option будет выбран в итоге
value = value || random
# выбираем нужный option
options.each do |option|
option.click if value == random
end
end
Работу рецепта можно сразу проверить.
require 'selenium-webdriver'
def select options
#...
end
driver = Selenium::WebDriver.for :chrome
driver.get 'data:text/html,<select><option value="volvo">Volvo</option><option value="saab">Saab</option><option value="opel">Opel</option><option value="audi">Audi</option></select>'
select what: '/html/body/select', driver: driver