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

时间:2018-08-03 05:36:37

标签: watir

当我写

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

单击后,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允许我通过自动切换在父窗口上进行操作,但是如果在自动切换后关闭子窗口,即使进行了自动切换或已连接至该窗口,我也无法连接回父窗口父窗口丢失。

1 个答案:

答案 0 :(得分:0)

啊,看来我们进行的性能增强导致与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

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

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

b.wd.switch_to.default_content