也许这实际上不是我遇到的问题,但似乎当我“click_link”一个带有target =“_ blank”的链接时,会话将焦点保持在当前窗口。
所以我要么能够切换到新窗口,要么忽略_blank属性 - 本质上,我只是希望它实际上转到链接指示的页面,这样我就能确保它是正确的页面。
我使用webkit和selenium驱动程序。
我在下面提交了我的调查结果。非常感谢更彻底的答案。
此外,这只适用于selenium - 相当于webkit驱动程序(或指出我自己可以发现它的位置)将非常感激。
Capybara> = 2.3包括新的窗口管理API。它可以像:
new_window = window_opened_by { click_link 'Something' }
within_window new_window do
# code
end
你也可以传递一个窗口的名称,网址或标题(但现在它的二进制)
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
你也可以传递lambda或proc
within_window(->{ page.title == 'Page title' }) do
click_button 'Submit'
end
希望它能够更加清晰地理解方法用法
要显式更改窗口,请使用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块中
我在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
最好的想法是将capybara更新到最新版本(2.4.1)并使用windows.last
,因为page.driver.browser.window_handles
已被弃用。
主要实现(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"]
此解决方案仅适用于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窗口切换功能的更多细节:http://qastuffs.blogspot.com/2010/10/testing-pop-up-windows-using-selenium.html
现在这是working与Poltergeist。虽然window_handles
仍未实现(您需要一个窗口名称,即通过JavaScript弹出窗口):
within_window 'other_window' do
current_url.should match /example.com/
end
编辑:根据下面的评论,自从window_handles
以来,Poltergeist现在实施version 1.4.0。
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
我知道这是一个老帖子,但它的价值在水豚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
似乎现在不可能使用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。
现在为capybara-webkit http://github.com/thoughtbot/capybara-webkit/pull/314实现了within_window,在这里你可以看到如何使用它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
这适用于capybara-webkit:
within_window(windows.last) do
# code here
end
(我使用的是capybara 2.4.1和capybara-webkit 1.3.0)