水豚,如何切换到新的窗口与“_blank”目标的链接?

也许这实际上并不是我遇到的问题,但似乎在“click_link”与target =“_ blank”的链接时,会话将焦点放在当前窗口上。

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

我使用webkit和selenium驱动程序。


我在下面提交了我的发现。 非常感谢一个更彻底的答案。

此外,这只适用于selenium – 相当于webkit驱动程序(或指出我可以发现它自己)将不胜感激。

水豚> = 2.3包含新的窗口pipe理API。 它可以用来像:

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

此解决scheme仅适用于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/173

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

现在正在和Poltergeist合作。 虽然window_handles还没有实现(你需要一个窗口名,即通过JavaScriptpopup):

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

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

水豚提供了一些方法来简化查找和切换窗口:

 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 

更多细节在这里: 水豚文件

似乎现在不可能与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/47build议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中的代码至less有一些提示,指出适用于webdriver / firefox的API也适用于WebKit的。

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

截至2014年5月,以下代码在capybara-webkit上运行

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

我知道这是旧post,但为什么它值得水豚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 

这在水豚-webkit中适用于我:

 within_window(windows.last) do # code here end 

(我正在使用水豚2.4.1和水豚 – webkit 1.3.0)

在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 

您可以传递一个名称url标题的窗口也(但现在它的dipricated)

  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 

希望它延伸方法的使用更清晰地认识

最好的想法是更新水豚到最新版本(2.4.1),只是使用windows.last因为page.driver.browser.window_handles已弃用。

要显式更改窗口,请使用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