2013-04-05 61 views
5

在Chrome中,使用watir-webdriver,我单击一个按钮打开一个子浏览器窗口。关闭本身的孩子浏览器窗口显然打破了父窗口的Watir-webdriver链接?

我做的:

@browser.window(title: 'Child').use 

我成功地在子窗口的各种物品进行互动。

很快,在这个窗口中有一个操作,该站点认为这是首先打开窗口的“要点”。例如,

@browser.button(title: 'Button').click 

当执行此操作时,子窗口关闭本身。

当我告诉的Watir-的webdriver但是回去使用父窗口,我得到一个错误:

@browser.window(title: 'Parent').use # => results in 
# Selenium::WebDriver::Error::NoSuchWindowError: emptyScript execution failed; 
# The window could not be found 

的原因,我相信这是一个硒/的Watir-webdriver的错误是因为以下代码工作原理:

@browser.window(title: 'Child').use 
# ... Now I do various things in the child window that do NOT 
# ... cause it to close itself. They all work as expected. 
# ... 
puts @browser.window(title: 'Parent').present? #=>true 
@browser.window(title: 'Child').close 
puts @browser.window(title: 'Parent').present? #=>true 
@browser.window(title: 'Parent').use # => No error thrown 

唯一的区别是导致子窗口关闭自身的操作。

我注意到watirspec代码没有自闭窗口的测试用例,所以也许这是watir-webdriver中windows代码的一个被忽视的方面。

好了,这里是你可以运行代码,看看这个问题自己:

require 'watir-webdriver' 
@b = Watir::Browser.new :chrome 
@b.goto 'ckeditor.com/demo#full' 
@b.div(id: 'cke_editor1').link(title: 'Link').click 
@b.link(title: 'Browse Server').wait_until_present 
@b.link(title: 'Browse Server').click 
@b.window(title: 'CKFinder').use { 
    @b.frame(title: 'CKFinder').link(id: 'r0').right_click 
    @b.frame(title: 'CKFinder').frame(id: 'cke_22_frame').wait_until_present 
    @b.frame(title: 'CKFinder').frame(id: 'cke_22_frame').link(id: 'cke_200').click 
} 

,这将导致该错误:

Selenium::WebDriver::Error::NoSuchWindowError: emptyScript execution failed; 
The window could not be found 

不要说我从来没有nuthin'为你! :-)

现在,在你问“为什么要测试第三方编辑工具,你疯了吗?”之前。我会为你回答:我不是。

我测试的是由CKEditor工具生成的源代码在特定情况下得到适当更新(这远远超出了这个问题的范围)。设置这个要求我首先知道源代码,以便稍后我可以验证它是否被不同的进程正确更新。要做到这一点,我必须先使用CKEditor的链接工具正确设置它。 Capiche?

+0

您使用'硒能够做这样的事情(未测试) '或'watir' webdriver? – 2013-04-05 21:45:27

+0

Watir-webdriver - 就像它在我的第一句话中所说的那样。 :-) – 2013-04-05 21:46:03

+0

我看着watirspec,abe在这方面是对的。我们在那里进行测试,看看我们能看到子窗口,但就是这样。我们没有例如对rdoc中的示例代码显示进行测试以供使用.. – 2013-04-05 22:20:59

回答

1

如果您需要我们回到第一个窗口打开后,您可以使用

@browser.windows[0] 

您也可以

@browser.windows.each do |window| 
    if window.title.include?(target_string) 
    window.use 
    end 
end 
+0

如果之前该行代码被运行没有发生错误那将是巨大的(不幸的是这会发生什么)。 – 2013-08-27 21:28:48