17

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

有没有办法为 Capybara 重新加载 DOM,或者这个 gem 中是否有一些我还没有学过的元素?

提前致谢!

==编辑==

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

wait_for_element 

方法。

==编辑==

尝试执行以下操作时,我不断收到“nill 类的未定义方法'wait_for_element`”:

@selenium.wait_for_element

看起来那个特定的方法,或者可能是wait_for用一个巨大的选择器访问我期望的 DOM 元素是正确的做法,但现在尝试获取 selenium 会话开始变得非常头疼。

4

3 回答 3

17

我在 RSpec 中为 Capybara 使用基于 Webdriver 的驱动程序,我像这样配置和使用它,它肯定会处理 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 的速度,就像这样,如果你想用慢动作看东西:

   #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
于 2011-02-27T13:34:35.350 回答
7

来自 Capybara 文档:

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

您可能会幸运地增加等待时间:

Capybara.default_wait_time = 10

如果这没有帮助,那么我会鼓励您联系 GitHub 上项目中的某个人,写信给邮件列表或提交问题报告。

于 2011-01-03T15:28:09.070 回答
0

甚至从 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
于 2016-04-15T17:41:12.607 回答