Capybara не распознает динамически добавляемые элементы DOM?

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

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

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

==Изменить==

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

wait_for_element 

метод.

==Изменить==

Я продолжаю получать «неопределенный метод 'wait_for_element` для нулевого класса» при попытке сделать следующее:

@selenium.wait_for_element

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


person kelly.dunn    schedule 06.10.2010    source источник


Ответы (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

Вчера вечером я также придумал хак для замедления работы веб-драйвера, например, если вы хотите смотреть в замедленном режиме:

   #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
person ebeland    schedule 27.02.2011
comment
спасибо @ebeland. теперь, после многих месяцев использования чего-то подобного в наших тестах на работе, метод wait_until, без сомнения, правильный путь :) - person kelly.dunn; 25.06.2011
comment
wait_until был удален из Capybara 2.0.0. см. этот пост в блоге - person David Tuite; 20.11.2013

Из документов Capybara:

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

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

Capybara.default_wait_time = 10

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

person thomasfedb    schedule 03.01.2011
comment
+1 здесь. Capybara использует это время ожидания по умолчанию для вызовов методов, таких как has_selector? has_css? и так далее. Таким образом, вы можете использовать эти методы, чтобы дождаться появления элемента, используя что-то вроде: has_css?("a#myinput", :visible => true), который будет ждать, пока элемент не появится на экране, прежде чем продолжить. - person bergyman; 18.03.2011
comment
где я должен поставить Capybara.default_wait_time = 10? - person アレックス; 03.03.2015
comment
@AlexanderSupertramp в вашем spec/rails_helper.rb, если он у вас есть, иначе ваш spec/spec_helper.rb. - person thomasfedb; 03.03.2015
comment
Какое отношение Cucumber имеет к каталогу RSpec, который называется /spec? - person アレックス; 03.03.2015
comment
@AlexanderSupertramp Ничего! Этот вопрос касается использования Capybara с RSpec, а не о огурце. - person thomasfedb; 04.03.2015

Даже 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
person Saikat    schedule 15.04.2016