Капибара не распознает динамически добавленные элементы DOM? - PullRequest
17 голосов
/ 07 октября 2010

Кажется, у меня проблемы с тестированием гладких javascript вещей, которые я делаю с jQuery при использовании Capybara и Selenium.Ожидаемое поведение для формы, которая будет генерироваться динамически, когда пользователь нажимает на ссылку «добавить ресурс».Capybara сможет щелкнуть ссылку, но не сможет распознать новые элементы формы (например, «resource [name]»).

Есть ли способ перезагрузить DOM для Capybara или есть какой-то элементэтот драгоценный камень, о котором я только что не узнал?

Заранее спасибо!

== Редактировать ==

В настоящее время пытаюсь попытать счастья сметод Селена:

wait_for_element 

.

== Редактировать ==

Я получаю "неопределенный метод" wait_for_element` для класса nill "при попытке сделать следующее:

@selenium.wait_for_element

Кажется, что этот конкретный метод, или, возможно, wait_for с огромным селектором, обращающимся к элементу DOM, я ожидаю, является правильным курсом действий, но теперь пытаюсь получитьсеанс селена начинает вызывать огромную головную боль.

Ответы [ 3 ]

17 голосов
/ 27 февраля 2011

Я использую драйвер на основе 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:

   #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
7 голосов
/ 03 января 2011

Из документов на Капибару:

При работе с асинхронным JavaScript, вы можете столкнуться ситуации, когда вы пытаетесь взаимодействовать с элементом, который не является пока присутствует на странице. Водосвинка автоматически справляется с этим ожидание появления элементов на стр.

Возможно, вам повезет, увеличив время ожидания:

Capybara.default_wait_time = 10

Если это не поможет, я бы посоветовал вам связаться с кем-то из проекта на GitHub, написать в список рассылки или отправить отчет о проблеме.

0 голосов
/ 15 апреля 2016

Даже 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...