Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 你能关闭水豚岛所有打开的窗户吗?_Ruby_Selenium_Capybara - Fatal编程技术网

Ruby 你能关闭水豚岛所有打开的窗户吗?

Ruby 你能关闭水豚岛所有打开的窗户吗?,ruby,selenium,capybara,Ruby,Selenium,Capybara,因此,当我单独运行测试时,它们工作得非常好。但是,当我运行我的功能(多个测试)时,我的代码失败。 这是因为当水豚存在时,并不是所有的窗口都关闭,因此我的selenium驱动程序不知道使用哪个窗口 基本上,我的测试正在打开多个窗口。这是因为我的测试正在单击打开新窗口的链接并检查新窗口中的内容。即使我在每次测试结束时说page.quit,该函数也不会关闭所有打开的窗口(关闭活动窗口,但不会关闭原始窗口)。当第二个测试运行时,它使用最初的创建窗口,但是当它打开新的弹出窗口时,它使用了错误的窗口 如何确

因此,当我单独运行测试时,它们工作得非常好。但是,当我运行我的功能(多个测试)时,我的代码失败。
这是因为当水豚存在时,并不是所有的窗口都关闭,因此我的selenium驱动程序不知道使用哪个窗口

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

如何确保在每次测试期间使用新浏览器,并且关闭上一次测试中的所有窗口。
我目前正在使用
page.reset
页面。退出

不确定,但我可以说
会话。退出
关闭所有打开的浏览器窗口吗?

尝试以下操作:

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

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

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

within_window(page.driver.browser.window_handles.last) do
  click buttons and stuff...
  ...
  page.driver.browser.close #closes popup
end
希望对您有所帮助

此代码有效:

page.execute_script "window.close();"
我只是在要关闭的窗口中执行此操作

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

end
你为我施了魔法。结合@Jason和@Justin的答案

谢谢

试试这个:

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

这对我很有用。

将其添加到功能测试中,它将重置会话cookie并在空白页上启动测试:

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

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

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

在这里添加这个页面是因为“水豚关闭所有窗口”的前几个谷歌结果中出现了这个页面

我们有一些神秘的特性规范失败,我们追踪到有几个在第二个选项卡中打开了应用程序链接——因为这些选项卡只是保持打开状态,它们经常会触发一个失败的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

使用水豚的
headless\u-chrome
驱动程序,这对我们来说很有吸引力。

这不起作用,“退出”功能不存在。和Close一样。不过这是随机的。这次它给了我
失败/错误:无法从回溯中找到匹配的行Selenium::WebDriver::Error::NoSuchWindowError:getUrl执行失败;找不到窗口
quit函数未定义此函数不起作用,因为所有资源都已丢失,第二次测试失败,出现“browser not found”(浏览器未找到)或类似的内容。如果使用脏表单之类的插件,并且屏幕上有脏表单,则此代码不起作用,在这种情况下,javascript会弹出一个“您确定”警报,页面未关闭。最好执行“page.reset!”!“在运行测试之前。
page.execute_script”window.close();“
对我不起作用。应该没有
,即
page.execute\u script”window.close()“