17

Capybara と Selenium を使用しているときに、jQuery で行う洗練された JavaScript のテストに問題があるようです。期待される動作は、ユーザーが「リソースの追加」リンクをクリックしたときにフォームが動的に生成されることです。Capybara はリンクをクリックできますが、新しいフォーム要素 (つまり、"resource[name]") を認識できません。

Capybara の DOM をリロードする方法はありますか、それとも、まだ知らないこの宝石の要素はありますか?

前もって感謝します!

==編集==

現在、セレンで私の運を試しています:

wait_for_element 

方法。

==編集==

次のことをしようとすると、「nill クラスの未定義メソッド 'wait_for_element`」が表示され続けます。

@selenium.wait_for_element

その特定の方法、またはおそらくwait_for私が期待するDOM要素にアクセスする巨大なセレクターを使用することは正しい行動方針であるように見えますが、現在、セレンセッションを取得しようとすることは大きな頭痛の種になり始めています.

4

3 に答える 3

17

私は RSpec で Capybara 用の Webdriver ベースのドライバーを使用しています。これは、このように構成して使用すると、JS を確実に処理し、dom のリロードを必要としません。キーは、wait_until と、AJAX 応答が終了したときに true になる条件を使用することです。

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

カピバラのドキュメントから:

非同期JavaScriptを使用しているときに、ページにまだ存在していない要素を操作しようとしている状況に遭遇する可能性があります。Capybaraは、要素がページに表示されるのを待つことで、これを自動的に処理します。

運が良ければ待ち時間が長くなるかもしれません。

Capybara.default_wait_time = 10

それでも問題が解決しない場合は、GitHubのプロジェクトの誰かに連絡するか、メーリングリストに書き込むか、問題レポートを送信することをお勧めします。

于 2011-01-03T15:28:09.070 に答える
0

カピバラ 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 に答える