使用Capybara,如何切换到带有"_blank"目标的链接的新窗口?

Gly*_*yph 74 testing selenium webkit ruby-on-rails capybara

也许这实际上不是我遇到的问题,但似乎当我"click_link"一个带有target ="_ blank"的链接时,会话将焦点保持在当前窗口.

所以我要么能够切换到新窗口,要么忽略_blank属性 - 本质上,我只是希望它实际上转到链接指示的页面,这样我就能确保它是正确的页面.

我使用webkit和selenium驱动程序.


我在下面提交了我的调查结果.非常感谢更彻底的答案.

此外,这只适用于selenium - 相当于webkit驱动程序(或指出我自己可以发现它的位置)将非常感激.

And*_*lov 81

Capybara> = 2.3包括新的窗口管理API.它可以像:

new_window = window_opened_by { click_link 'Something' }
within_window new_window do
  # code
end
Run Code Online (Sandbox Code Playgroud)

  • poltergeist 1.6实现了这个API,因此在撰写本文时,这是与poltergeist一起使用的方法. (3认同)

Gly*_*yph 54

此解决方案仅适用于Selenium驱动程序

所有打开的窗户都是Selenium的商店

response.driver.browser.window_handles
Run Code Online (Sandbox Code Playgroud)

这似乎是一个数组.最后一项始终是最近打开的窗口,这意味着您可以执行以下操作切换到它.

在一个街区内:

new_window=page.driver.browser.window_handles.last 
page.within_window new_window do
  #code
end
Run Code Online (Sandbox Code Playgroud)

只需重新聚焦当前会话:

session.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
Run Code Online (Sandbox Code Playgroud)

参考了水豚问题页面:https://github.com/jnicklas/capybara/issues/173

有关Selenium窗口切换功能的更多详细信息:http://qastuffs.blogspot.com/2010/10/testing-pop-up-windows-using-selenium.html

  • 这很好,但第二个例子有点误导.`session`和`page`之间没有区别,所以`session.driver.browser`和`page.driver.browser`实际上是指同一个东西.在尝试将其调整到不同的环境,通过不同的库访问Capybara而不使用DSL时,这让我感到困惑.我不得不阅读Capybara DSL代码来弄清楚要访问'page`,我只需要访问会话. (4认同)
  • 它不仅适用于Selenium:`within_window(page.driver.window_handles.last)`适用于**capybara-webkit**. (3认同)
  • 如下所述,Capybara有一个处理Windows的新语法:https://github.com/jnicklas/capybara#working-with-windows (2认同)

小智 10

现在与Poltergeist合作.虽然window_handles仍未实现(您需要一个窗口名称,即通过JavaScript弹出窗口):

within_window 'other_window' do
  current_url.should match /example.com/
end
Run Code Online (Sandbox Code Playgroud)

编辑:下面的评论,Poltergeist现在实现window_handles版本1.4.0.

  • 我刚试过`page.within_window page.driver.browser.window_handles.last do ...`它似乎在Poltergeist中按预期工作.无需提供窗口名称.所以这个答案可能需要更新. (3认同)

Ara*_*vin 9

Capybara提供了一些方法来轻松查找和切换窗口:

facebook_window = window_opened_by do
  click_button 'Like'
end
within_window facebook_window do
  find('#login_email').set('a@example.com')
  find('#login_password').set('qwerty')
  click_button 'Submit'
end
Run Code Online (Sandbox Code Playgroud)

更多细节:Capybara文档


bca*_*car 8

我知道这是一个老帖子,但它的价值在水豚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
Run Code Online (Sandbox Code Playgroud)


use*_*837 7

似乎现在不能使用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上的代码至少有一些引用,表明适用于webdriver/firefox的API也适用于WebKit的.


小智 6

现在为capybara-webkit http://github.com/thoughtbot/capybara-webkit/pull/314实现了within_window ,在这里你可以看到如何使用它http://github.com/mhoran/capybara-webkit-demo


the*_*fme 6

截至2014年5月,以下代码适用于capybara-webkit

 within_window(page.driver.browser.window_handles.last) do
   expect(current_url).to eq('http://www.example.com/')
 end
Run Code Online (Sandbox Code Playgroud)


G. *_*Joe 6

要显式更改窗口,请使用switch_to_window

  def terms_of_use
    terms_window = window_opened_by do
      click_link(@terms_link)
    end
    switch_to_window(terms_window)
  end
Run Code Online (Sandbox Code Playgroud)

在该方法之后,浏览器将在新页面中工作,而不是将所有内容都包装在一个inside_window块中


lav*_*tle 5

这在 capybara-webkit 中对我有用:

within_window(windows.last) do
  # code here
end
Run Code Online (Sandbox Code Playgroud)

(我使用的是水豚 2.4.1 和 capybara-webkit 1.3.0)