如何关闭子 window 并在第一个 window 上开始操作

How do I close the child window and start operating on first window

当我写

b.windows.last.use do
  b.link.click
end

点击后WATIR自动切换回firstwindow,现在可以在first上开始操作了window,但是不知道怎么关闭这个childwindow ] 并在第一个 window 上开始操作。我可以在 selenium 中完成,但我不知道如何在 WATIR 中完成。

我试过的

require 'watir'
driver = Selenium::WebDriver.for :firefox
b = Watir::Browser.new driver
b.goto("https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open")

b.iframe(id: 'iframeResult').element(xpath: "//button[contains(text(),'Try it')]").click
firstWindow=b.windows.first

b.windows.last.use do
  b.element(text: 'LEARN HTML').click
end #end of this block automatically switch back to first window.

b.windows.last.close #Closing the child window 

#b.iframe(id: 'iframeResult').element(xpath: "//button[contains(text(),'Try it')]").click 
#This above line is not working so made a switch in the following line

firstWindow.use do #but it's not working as expected too.
  b.iframe(id: 'iframeResult').element(xpath: "//button[contains(text(),'Try it')]").click
end

WATIR 允许我通过自动切换在父级 window 上操作,但是如果我在这个自动切换后关闭子级 window,我将无法连接回父级window 即使自动切换已完成或与父 window 的连接丢失。

啊,看起来我们所做的性能增强导致了与 Firefox 的错误冲突 - https://github.com/mozilla/geckodriver/issues/610

首先,我个人在使用 windows 时避免使用块,因此我的代码如下所示:

b.window(url: 'https://www.w3schools.com/').use
# do things
b.window.close
b.original_window.use

问题是因为打开第二个 window 的元素在 iframe 中,当 Watir 切换回第一个 window 时,Firefox 将浏览上下文保留在 iframe 中而不是恢复它到顶级上下文。 Watir 过去总是在每次元素查找时重置它,但那些是额外的线路调用,所以我们缓存了上下文,现在只在必要时调用切换到顶部。

在 Mozilla 修复该错误之前的临时解决方法是:

b.wd.switch_to.default_content