Capybara не распознает динамически добавленные элементы DOM?
Кажется, у меня проблемы с тестированием пятнистых javascript, которые я делаю с jQuery при использовании Capybara и Selenium. Ожидаемое поведение заключается в том, что форма динамически генерируется, когда пользователь нажимает ссылку "добавить ресурс". Capybara сможет щелкнуть ссылку, но не сможет распознать новые элементы формы (т.е. "Resource [name]" ).
Есть ли способ перезагрузить DOM для Capybara, или есть какой-то элемент этого драгоценного камня, о котором я еще не узнал?
Спасибо заранее!
== Edit ==
В настоящее время стараюсь удачи в селене:
wait_for_element
метод.
== Edit ==
Я продолжаю получать метод undefined "wait_for_element` для класса nill" при попытке сделать следующее:
@selenium.wait_for_element
Похоже, что этот конкретный метод или, возможно, wait_for
с огромным селектором, обращающимся к элементу DOM, который я ожидаю, является правильным курсом действия, но теперь попытка получить сеанс селена начинает представлять собой огромную головную боль.
Ответы
Ответ 1
Я использую драйвер на основе Webdriver для Capybara в RSpec, который я настраиваю и использую как это, и он определенно обрабатывает JS и не нуждается в перезагрузке dom. Ключ использует wait_until и условие, которое будет истинным, когда ваш ответ AJAX завершен.
before(:each) do
select_driver(example)
logout
login('databanks')
end
def select_driver(example)
if example.metadata[:js]
Capybara.current_driver = :selenium
else
Capybara.use_default_driver
end
end
it "should let me delete a scenario", :js=>true do
select("Mysite Search", :from=>'scenario_id')
wait_until{ page.has_content?('mysite_searchterms')}
click_on "delete"
wait_until{ !page.has_content?('mysite_searchterms')}
visit '/databanks'
page.should_not have_content('Mysite Search')
end
Я также выяснил, что вчера вечером, когда вы хотите смотреть вещи в slo-mo, мы пытаемся замедлить работу webdriver:
#set a command delay
require 'selenium-webdriver'
module ::Selenium::WebDriver::Remote
class Bridge
def execute(*args)
res = raw_execute(*args)['value']
sleep 0.5
res
end
end
end
Как уже упоминалось, если вы получаете тайм-аут, ожидающий этого элемента, вы можете посмотреть на это:
Capybara.default_wait_time = 10
Ответ 2
Из документов Capybara:
При работе с асинхронными JavaScript, вы можете столкнуться ситуации, когда вы пытаетесь взаимодействовать с элементом, который не является но присутствуют на странице. Водосвинка автоматически справляется с этим ожидая появления элементов на стр.
Возможно, вам удастся увеличить время ожидания:
Capybara.default_wait_time = 10
Если это не поможет, я хотел бы связать вас с кем-либо из проекта на GitHub, написать в список рассылки или отправить отчет о проблеме.
Ответ 3
Даже wait_until удаляется из Capybara 2.0. Тем не менее этот полезный и захватывающий код снизу:
def wait_until(delay = 1)
seconds_waited = 0
while ! yield && seconds_waited < Capybara.default_wait_time
sleep delay
seconds_waited += 1
end
raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield
end