你可以关闭水豚的所有打开的窗户吗?

时间:2012-05-25 18:06:46

标签: ruby selenium capybara

因此,当我单独运行测试时,它们的效果非常好。但是,当我运行我的功能(多次测试)时,我的代码失败了 这是因为当水豚存在时,并非我的所有窗户都关闭,因此我的硒司机不知道使用哪个窗口。

基本上,正在发生的事情是我的测试是打开多个窗口。发生这种情况是因为我的测试是点击链接,这些链接打开新窗口并检查新窗口中的内容。即使我在每个测试结束时说page.quit,此函数也没有关闭所有打开的窗口(关闭活动窗口但不关闭原始窗口)。当第二个测试运行时,它使用最初的创建窗口,但是当它打开新的弹出窗口时,它会使用错误的窗口。

如何确保在每次测试期间使用新浏览器,并关闭上一次测试中的所有窗口 我目前正在使用page.reset!page.quit 不确定,但是我可以说session.quit关闭所有打开的浏览器窗口吗?

8 个答案:

答案 0 :(得分:8)

此代码有效:

page.execute_script "window.close();"

我只是在我要关闭的窗口中执行此操作。

答案 1 :(得分:4)

我使用此代码片段来访问弹出窗口并在之后关闭它们。这应该没什么区别

within_window(page.driver.browser.window_handles.last) do
  click buttons and stuff...
  ...
  page.driver.browser.close #closes popup
end

希望有所帮助

答案 2 :(得分:3)

page.driver.browser.window_handles.each do |handle|
  page.driver.browser.switch_to.window(handle)
  page.execute_script "window.close()"

end

对我来说有魅力吗?结合@Jason和@Justin的答案。

谢谢!

答案 3 :(得分:1)

尝试以下方法:

page.driver.browser.window_handles.each do |handle|
  page.driver.browser.switch_to.window(handle)
  page.quit
end

(我认为它会起作用,但我没有机会测试它。)

答案 4 :(得分:1)

试试这个:

tab_id = page.driver.find_window("http://google.com.au")
page.driver.browser.switch_to.window(tab_id)
page.driver.quit

这对我有用。

答案 5 :(得分:1)

为了在spec文件中包含所有断言,我将控制传递给新页面(窗口),执行断言后我关闭 new页面和传递控件到原始页面如下:

after(:each) do
  expect(@static_page.has_logo?).to eq(true) # assertion in new page
  page.execute_script('window.close()') # close new page
  switch_to_window(windows.first) # return control to first page
end

答案 6 :(得分:1)

在此处添加此内容是因为此页面出现在Google针对“水豚关闭所有窗口”的前几个结果中。

我们遇到了一些神秘的功能规格故障,我们可以追溯到在第二个选项卡中打开了一些应用程序链接的原因-由于这些选项卡只是保持打开状态,因此每隔很多次它们会触发失败的AJAX请求,而当前测试会用完全不相关的错误轰炸。我们修复该问题的方法是添加一个确保在每个功能规范之后关闭除当前窗口之外的所有窗口的钩子:

Rspec.configure do |config|
  config.after(type: :feature) do
    # Make sure all browser windows except one are closed
    windows.reject(&:current?).each(&:close)
  end
end

使用Capybara的headless_chrome驱动程序,这对我们来说就像一种魅力。

答案 7 :(得分:0)

将此添加到您的功能测试中,它会重置会话Cookie并在空白页面上开始测试:

# Window washing - use a clean window before every example
before(:example) do
  page.reset!
end