对于 Capybara,如何切换到新窗口以获得带有“_space”目标的链接?

也许这并不是我正在经历的问题,但似乎当我“ click _ link”带有 target = “ _ space”的链接时,会话将焦点保持在当前窗口上。

因此,我要么希望能够切换到新窗口,要么忽略 _ black 属性——本质上,我只是希望它能够切换到链接指示的页面,这样我就可以确保它是正确的页面。

我使用 webkit 和硒驱动程序。


我在下面提交了我的调查结果,如果你能给我一个更详尽的答案,我将不胜感激。

此外,这只适用于硒——相当于 webkit 驱动程序(或指出我可以在哪里发现它自己)将非常感谢。

42547 次浏览

此解决方案仅适用于 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

看起来现在用水豚网络工具箱是不可能的: 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。

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

这是现在的 工作与捣蛋鬼。尽管 window_handles还没有实现(你需要一个窗口名,比如通过一个 JavaScript 弹出窗口) :

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

编辑: 根据下面的评论,Poltergeist 现在从 1.4.0版本开始实现 window_handles

当我在 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

截至2014年5月,以下代码可以在 capybara-webkit 上工作

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

Capybara > = 2.3包含了新的窗口管理 API:

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

这对我在水豚网络工具箱中很有用:

within_window(windows.last) do
# code here
end

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

我知道这是旧的职位,但它的价值在水豚2.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 升级到最新版本(2.4.1) ,然后就可以使用了 windows.last 因为 page.driver.browser.window_handles已被弃用。

也可以传递窗口的 姓名网址书名 (但是现在它有了分歧)

  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程序

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

希望它能将方法的使用扩展到更清楚地理解

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

详情请浏览这里: 水豚记录

若要显式更改窗口,请使用 译自: 美国《科学》杂志网站(http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Session # switch _ to _ window-instance _ method)原文地址: http://www.rubydoc.info/github/capybara/master/Capybara/Session # switch _ to _ window-instance _ method

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

该方法之后的浏览器将在新页面中工作,而不是将所有内容包装在 一个 href = “ http://www.rubydoc.info/github/jnicklas/capybara/master/Capybara/Session # inside _ window-instance _ method”rel = “ noReferrer”> inside _ window 块中

主实现(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"]

我个人喜欢下面的方法,因为无论是否启用 JS,它都能正常工作。

我的规格:

  it "shows as expected" do
visit my_path


# ...test my non-JS stuff in the current tab


switch_to_new_tab


# ...test my non-JS stuff in the new tab
    

# ...keep switching to new tabs as much as necessary
end


# OR


it "shows as expected", js: true do
visit my_path


# ...test my non-JS stuff in the current tab
# ...also test my JS stuff in the current tab


switch_to_new_tab


# ...test my non-JS stuff in the new tab
# ...also test my JS stuff in the new tab


# ...keep switching to new tabs as much as necessary
end


测试帮手:

  def switch_to_new_tab
current_browser = page.driver.browser


if js_enabled?
current_browser.switch_to.window(current_browser.window_handles.last)
else
visit current_browser.last_request.fullpath
end
end


def js_enabled?
Capybara.current_driver == Capybara.javascript_driver
end