Выбор параметров один за другим Используя watir-webdriver-
b.select_list(:id, "MainContent_drpVehicleType").when_present.options.each do |option|
option.select
b.select_list(:id, "MainContent_drpMake").when_present.options.each do |option|
option.select
b.select_list(:id, "MainContent_drpModel").when_present.options.each do |option|
option.select
b.button(:id,"MainContent_imgbtnsearch").click
end
end
end
У меня три раскрывающихся списка. Каждый раскрывающийся список зависит от предыдущих значений. Я должен выбрать каждый параметр один за другим и затем нажать кнопку. *Делая так, получая следующую ошибку* Элемент больше не присоединен к DOM (Selenium::WebDriver::Error::StaleElementReferenceError)
Также пробовал:
b.driver.manage.timeouts.implicit_wait = 3
3 ответа
Попробуйте следующее,
b.select_list(:id, "MainContent_drpVehicleType").when_present.options.each do |type_option|
type_option.select
sleep 5
b.select_list(:id, "MainContent_drpMake").when_present.options.each do |make_option|
make_option.select
sleep 5
b.select_list(:id, "MainContent_drpModel").when_present.options.each do |model_option|
model_option.select
sleep 5
b.button(:id,"MainContent_imgbtnsearch").click
end
end
end
Одна проблема у меня есть, что происходит после щелчка? если страница обновляется или выполняет что-то такое, что вы могли бы очень хорошо выпить с вложенным подходом, описанным выше, поскольку после этого первого щелчка нет способа изменить свой выбор в третьем списке и щелкнуть снова.
Если ничего из вышеперечисленного не сработает, вам, возможно, придется немного подглядывать, чтобы увидеть, какие HTML-запросы (возможно, к REST API) выполняются, когда вы делаете выбор в списке. Возможно, вы сможете использовать это для создания своего собственного многомерного массива для сопоставления вариантов. Или вы могли бы получить различное содержимое списка выбора со структурой цикла, аналогичной той, что у вас была выше, ТО через цикл и делайте ваши клики
Получив карту, выполните итерацию по ее измерению по измерению, используя вложенные циклы, аналогичные описанным выше, но выполняйте все свои действия в самом внутреннем цикле, что составляет сумму этого псевдо-кода.
gather the types and store
for each stored-type do
pick the type
gather makes available for that type and store
for each make of that type do
pick the type, then make
gather models available for that type
for each model of that make do
goto starting point
select type
select make
select model
click
validate what should happen
end
end
end
Предполагая, что каждый параметр уникален, вы можете попробовать:
- Получить последний вариант в зависимом списке
- Сделайте выбор в вашем текущем списке
- Подождите, пока параметр в шаге 1 больше не появится
Следующее реализует эту идею (хотя она не была проверена, так как у меня нет аналогичной страницы для тестирования):
b.select_list(:id, "MainContent_drpVehicleType").when_present.options.each do |option|
#Select a vehicle type and wait for the last make option to no longer appear
last_make_option = b.select_list(:id, "MainContent_drpMake").when_present.options.last
option.select
last_make_option.wait_while_present
b.select_list(:id, "MainContent_drpMake").when_present.options.each do |option|
#Select a make and wait for the last model option to no longer appear
last_model_option = b.select_list(:id, "MainContent_drpModel").when_present.options.last
option.select
last_model_option.wait_while_present
b.select_list(:id, "MainContent_drpModel").when_present.options.each do |option|
option.select
b.button(:id,"MainContent_imgbtnsearch").click
end
end
end
Обратите внимание, что:
- Код предполагает, что последний параметр зависимого списка всегда будет меняться. Если это не так, вам может потребоваться проверить все параметры зависимого списка.