Работа с Select tag в Selenium WebDriver на Ruby

Среди всех элементов, с которыми мы взаимодействуем через 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
2 лайка