Вопрос

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

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

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

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

В настоящее время пытаясь повезло с Selenium's:

wait_for_element 

метод.

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

Я продолжаю получать «неопределенный метод» Wait_for_Element` для класса NILL «При попытке сделать следующее:

@selenium.wait_for_element

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

Это было полезно?

Решение

Я использую драйвер на основе 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 автоматически касается этого, ожидая появления элементов на странице.

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

Capybara.default_wait_time = 10

Если это не поможет, то я бы перевозить вас, чтобы связаться с кем-то из проекта на 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top