Capybara не распознает динамически добавляемые элементы DOM?
кажется, у меня возникли проблемы с тестированием гладких javascript-вещей, которые я делаю с jQuery при использовании капибары и Селена. Ожидаемое поведение для формы, которая будет динамически генерироваться, когда пользователь нажимает на ссылку "Добавить ресурс". Capybara сможет щелкнуть ссылку, но не распознает новые элементы формы (т. е. "ресурс[имя]").
есть ли способ перезагрузить DOM для Capybara, или есть какой-то элемент этого драгоценного камня, о котором я просто не узнал пока?
спасибо заранее!
= = Edit==
В настоящее время пробую свою удачу с selenium:
wait_for_element
метод.
= = Edit==
Я продолжаю получать "неопределенный метод" wait_for_element "для класса nill" при попытке сделать следующее:
@selenium.wait_for_element
похоже, что этот конкретный метод, или, возможно,wait_for
С огромным селектором, обращающимся к элементу DOM, я ожидаю, что правильный курс действий, но теперь попытка получить сеанс Селена начинает быть огромной головной болью.
3 ответов
Я использую драйвер на основе 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
Я также выяснил хак, чтобы замедлить webdriver прошлой ночью, как это, если вы хотите смотреть вещи в slo-mo:
#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
из документов Capybara:
при работе с асинхронными JavaScript, вы можете встретить ситуации, в которых вы пытаетесь взаимодействие с элементом, которого нет и все же присутствует на странице. Водосвинка автоматически общается с этим мимо ожидание появления элементов на страница.
возможно, Вам ПОВЕЗЕТ увеличить время ожидания:
Capybara.default_wait_time = 10
Если это не поможет, то я бы encorage вам связаться кто-то из проекта на GitHub, напишите в список рассылки или отправить отчет о проблеме.
даже 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