我正在查看Watir wiki Watir File Uploads
中的文件上传部分我正在使用的环境:
我的代码如下:
ie = Watir::Browser.start("tinypic.com")
ie.file_field(:id, "the_file").set("C:\\image.png")
现在,当文件“image.png”不存在时,它会产生一个弹出窗口,如下所示
我尝试使用Wiki上Javacript弹出部分中的弹出处理程序,但经过调试后,我发现除非处理弹出窗口,否则set方法不会返回。
处理它的好方法是什么?在Google上搜索时,我发现某个地方你可以在Ruby中启动一个不同的进程并尝试关闭弹出窗口。如果是这种情况,我可以获得一些关于如何进行上述事情的示例代码或指南吗?
感谢您的帮助。
答案 0 :(得分:0)
我对这个答案也很感兴趣,而且我有一些信息......我正在使用watir-webdriver,但我认为我们可能会遇到同样的问题。
在watir-webdriver中,我可以通过使用AlertHelper扩展或手动覆盖javascript函数来处理大多数弹出窗口。这两种技术在http://watirwebdriver.com/javascript-dialogs/处描述......“手动覆盖”(页面下方)也应该适用于IE Watir。
你要包含这一行:ie.execute_script(“window.alert = function(){}”)
紧接在你的行之前:ie.file_field(:id,“the_file”)。set(“C:\ image.png”)
这可能适合你。
但是,如果AJAX和PHP动态生成警报或对话框,则这些技术不起作用。我一直在寻找一个解决方案,以便如何与PHP将它们发送到页面时调用的动态加载的javascript警报进行交互。在https://github.com/jarib/watir-webdriver/issues/103的讨论让我相信selenium-webdriver可以通过使用alert_box.text和alert_box.dismiss方法来做到这一点,但是watir-webdriver API还没有利用它,就我而言可以看到。
感谢任何能够提供更彻底的解决方案的人如何在watir和watir-webdriver中处理动态生成的警报。
凯文
答案 1 :(得分:0)
感谢您输入Kevin,
我实际上想出了这个答案[我从Watir Wiki方法1中调整了它]对于Watir General的以下post的乔治。我写了一个像这样的弹出处理程序:
require 'win32ole'
title = "Choose File to Upload"
begin
popupOccurred = false
autoIt = WIN32OLE.new('AutoItX3.Control')
timeout = 15
autoIt.WinWait(title, '', timeout)
autoIt.ControlClick(title, "", "&Open")
sleep 1
autoIt.WinWait(title, '', timeout)
isClicked = autoIt.ControlClick(title, "", "OK")
sleep 1
autoIt.ControlClick(title, "", "Cancel") if (isClicked == 1)
autoIt.ole_free
rescue
puts "Error closing popup, please close Manually"
end
在我的代码片段中,我执行了以下操作:
require 'watir'
b = Watir::Browser.start("tinypic.com")
#-- Launches the popup closer in a different process. other methods like
#-- Process.create or system(start rubyw C:\\popup_handler2.rb) or having the
#-- popup handler in a Thread did not work for me.
system("start ruby C:\\popup_handler2.rb")
b.file_field(:id, "the_file").set("C:\\image.png")
我非常感谢来自Watir大师/开发者/用户的一些反馈。
谢谢,
切塔尼亚