在使用Capybara和Selenium时,我似乎很难测试与JQuery一起使用的光滑Javascript的事情。当用户单击链接“添加资源”时,预期的行为是要动态生成的表单。 Capybara将能够单击链接,但无法识别新的表单元素(即“资源[名称]”)。

有没有办法为Capybara重新加载DOM,还是我还没有学到的宝石的某些元素?

提前致谢!

==编辑==

目前正在尝试使用硒的运气:

wait_for_element 

方法。

==编辑==

尝试执行以下操作时,我一直在获得“未定义的方法'wait_for_element“ for nill class”:

@selenium.wait_for_element

看来该特定方法,或者也许 wait_for 我期望访问DOM元素的巨大选择器是正确的行动方案,但是现在试图获得Selenium会话开始变得巨大的头痛。

有帮助吗?

解决方案

我在RSPEC中使用基于Web Driver的驱动程序为Capybara,我将其配置和使用,它肯定会处理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

其他提示

来自Capybara文档:

在使用异步JavaScript时,您可能会遇到您正在尝试与页面上尚不存在的元素进行交互的情况。 Capybara通过等待元素出现在页面上来自动处理此问题。

您可能会有些运气增加等待时间:

Capybara.default_wait_time = 10

如果这无济于事,那么我将使您与GitHub项目中的某人联系,写入邮件列表或提交问题报告。

甚至从Capybara 2.0中删除的Wait_until。仍然有用,并从下面获取代码:

 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