web-dev-qa-db-ja.com

カピバラで、「_ blank」ターゲットを含むリンクの新しいウィンドウに切り替えるにはどうすればよいですか?

おそらくこれは実際に私が経験している問題ではないかもしれませんが、target = "_ blank"でリンクを "click_link"すると、セッションは現在のウィンドウにフォーカスを維持しているようです。

だから、新しいウィンドウに切り替えるか、_blank属性を無視したい-基本的に、リンクで示されているページに実際に移動して、正しいページであることを確認したい.

私はwebkitおよびSeleniumドライバーを使用します。


これまでに調査結果を提出しました。より徹底的な答えをいただければ幸いです。

また、これはSeleniumでのみ機能します。webkitドライバーに相当するもの(または自分で発見できる場所を示すこと)は大歓迎です。

74
GlyphGryph

Capybara> = 2.3には、新しいウィンドウ管理APIが含まれています。次のように使用できます。

new_window = window_opened_by { click_link 'Something' }
within_window new_window do
  # code
end
81
Andrei Botalov

このソリューションは、Seleniumドライバーでのみ機能します

開いているウィンドウはすべてSeleniumのストアです

response.driver.browser.window_handles

これは配列のようです。最後の項目は常に最後に開いたウィンドウです。つまり、次の操作を行って切り替えられます。

ブロック内:

new_window=page.driver.browser.window_handles.last 
page.within_window new_window do
  #code
end

現在のセッションに再度焦点を合わせる:

session.driver.browser.switch_to.window(page.driver.browser.window_handles.last)

カピバラの問題ページで参照: https://github.com/jnicklas/capybara/issues/17

Seleniumのウィンドウ切り替え機能の詳細: http://qastuffs.blogspot.com/2010/10/testing-pop-up-windows-using-Selenium.html

54
GlyphGryph

これは、今では working Poltergeistと一緒です。 window_handlesはまだ実装されていません(ウィンドウ名、つまりJavaScriptポップアップを使用する必要があります):

within_window 'other_window' do
  current_url.should match /example.com/
end

編集:以下のコメントごとに、Poltergeistはwindow_handles以来 バージョン1.4.

10

Capybaraは、ウィンドウの検索と切り替えを容易にするいくつかの方法を提供します。

facebook_window = window_opened_by do
  click_button 'Like'
end
within_window facebook_window do
  find('#login_email').set('[email protected]')
  find('#login_password').set('qwerty')
  click_button 'Submit'
end

詳細はこちら: Capybara documentation

9
Aravin

私はこれが古い投稿であることを知っていますが、カピバラ2.4.4でその価値があるもののために

within_window(switch_to_window(windows.last)) do 
    # in my case assert redirected url from a prior click action
    expect(current_url).to eq(redirect['url'])
end
8
bcar

現時点ではcapybara-webkitでは不可能なようです: https://github.com/thoughtbot/capybara-webkit/issues/271

:

同時に---(https://github.com/thoughtbot/capybara-webkit/issues/129 は、_within_window_でウィンドウを切り替えることが可能であると主張しています。

また、 https://github.com/thoughtbot/capybara-webkit/issues/47 は、page.driver.browser.switch_to().window(page.driver.browser.window_handles.last)が機能することを示唆しています。えーと、コード読み取りについて。

https://github.com/thoughtbot/capybara-webkit/blob/master/lib/capybara/webkit/browser.rb のコードには、少なくとも、APIが機能することを示唆する参照がいくつかあります。 webdriver/firefoxはwebkitでも動作します。

7
user132837

2014年5月現在、以下のコードはcapybara-webkitで動作します

 within_window(page.driver.browser.window_handles.last) do
   expect(current_url).to eq('http://www.example.com/')
 end
6
thekindofme

現在、capybara-webkit用にwithin_windowが実装されています http://github.com/thoughtbot/capybara-webkit/pull/314 ここで、使用方法を確認できます http:// github。 com/mhoran/capybara-webkit-demo

6
E-Hauler

ウィンドウのnamerl、またはtitleを渡すこともできます(ただし、現在はその機能が省略されています)

  let(:product) { create :product }

  it 'tests' do
    visit products_path
    click_link(product.id)

    within_window(product_path(product)) do
      expect(page).to have_content(product.title)
    end
  end

labdaまたはprocも渡すことができます

within_window(->{ page.title == 'Page title' }) do
  click_button 'Submit'
end

メソッドの使用をより明確に理解できるように拡張したい

4
itsnikolay

これはcapybara-webkitで動作します:

within_window(windows.last) do
  # code here
end

(私はcapybara 2.4.1とcapybara-webkit 1.3.0を使用しています)

4
lavaturtle

ウィンドウを明示的に変更するには、switch_to_windowを使用します

  def terms_of_use
    terms_window = window_opened_by do
      click_link(@terms_link)
    end
    switch_to_window(terms_window)
  end

メソッドブラウザは、すべてをwithin_windowブロックでラップする代わりに、新しいページで動作します

4
G. I. Joe

最良のアイデアは、capybaraを最新バージョン(2.4.1)に更新し、windows.lastが廃止されているため、page.driver.browser.window_handlesを使用することです。

3
Adam Piotrowski

Gmailウィンドウでリンクを開くときにこの問題が発生しました。次のように修正しました。

Given /^(?:|I )click the "([^"]*)" link in email message$/ do |field|

  # var alllinks = document.getElementsByTagName("a");
  # for (alllinksi=0; alllinksi<alllinks.length; alllinksi++) {
  #   alllinks[alllinksi].removeAttribute("target");
  # }

  page.execute_script('var alllinks = document.getElementsByTagName("a"); for (alllinksi=0; alllinksi<alllinks.length; alllinksi++) { alllinks[alllinksi].removeAttribute("target"); }')

  within(:css, "div.msg") do
    click_link link_text
  end

end
3
complistic

メインの実装(window_opened_by)私にエラーを発生させます:

*** Capybara::WindowError Exception: block passed to #window_opened_by opened 0 windows instead of 1

だから、私はこの解決策でそれを解決します:

new_window = open_new_window

within_window new_window do
  visit(click_link 'Something')
end

page.driver.browser.window_handles
# => ["CDwindow-F7EF6D3C12B68D6B6A3DFC69C2790718", "CDwindow-9A026DEC65C3C031AF7D2BA12F28ADC7"]
0
Alexey Strizhak