Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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 无法使用rautomation找到系统弹出窗口的按钮_Ruby_Selenium Webdriver_Rautomation - Fatal编程技术网

Ruby 无法使用rautomation找到系统弹出窗口的按钮

Ruby 无法使用rautomation找到系统弹出窗口的按钮,ruby,selenium-webdriver,rautomation,Ruby,Selenium Webdriver,Rautomation,我正在使用SeleniumWebDriver和rautomation编写测试来处理系统弹出窗口。我在irb上进行了如下尝试: require 'selenium-webdriver' require 'rautomation' driver = Selenium::WebDriver.for :firefox driver.get "http://rubygems.org/gems/rautomation-0.9.2.gem" window = RAutomation::Window.new

我正在使用SeleniumWebDriver和rautomation编写测试来处理系统弹出窗口。我在irb上进行了如下尝试:

require 'selenium-webdriver'
require 'rautomation'

driver = Selenium::WebDriver.for :firefox
driver.get "http://rubygems.org/gems/rautomation-0.9.2.gem"

window = RAutomation::Window.new :title => "Opening rautomation-0.9.2.gem"

ok_button = window.button(:text => "&OK")
ok_button.exists?

cancel_button = window.button(:text => "&Cancel")
cancel_button.exists?
确定按钮存在吗?“取消”按钮是否存在?返回值为false。因此我不能点击按钮

我还尝试:

window.buttons.length
查找按钮数,但返回0

有人能帮我解释一下为什么用rautomation检测不到这些按钮吗?如果我做错了,请纠正我

下面是一个弹出窗口:


单击该链接时,我没有看到任何弹出窗口。Chrome只下载一个文件。:)这可能会有所帮助:

此对话框的问题在于它不使用本机Windows控件。当您使用或时,它们也不会在该窗口中显示任何控件

使用RAutomation时,您可以检查其上是否有本机控件,如下所示:

win = RAutomation::Window.new :title => /Opening rautomation/
p win.present?
p win.controls.length
p win.text
win.close
ENV["RAUTOMATION_ADAPTER"] ||= :ms_uia
require "rautomation"
此脚本的输出将是:

true
0
""
换句话说-窗口存在,它没有任何类型的控件,文本是空字符串。此外,关闭窗口确实关闭了它,您可以通过视觉进行验证-这意味着我们正在与正确的窗口交互,而不是意外地与其他空窗口交互(注意:有时也可能发生这种情况)

这都意味着您不能直接使用AutoIt、RAutomation或许多其他自动化工具与控件交互。可能有一些特定的自动化工具可用于处理此类对话框-我不确定

但是,有一个解决方法可以解决如何使用此类窗口的问题—向窗口发送所需的击键。在这种情况下,发送return/enter键就可以了,因为这与单击“OK”按钮相同-您可以手动尝试

下面是示例代码,其工作原理与单击“确定”按钮相同:

我不知道为什么,但出于某种原因,您必须通过调用
window#activate
手动激活该窗口,并在发送
enter
键之前等待一秒钟

完成此操作后,将弹出一个新对话框,该对话框使用本机Windows控件-您可以按照最初预期的方式处理此对话框

但是,如果使用
:ms_uia
适配器而不是默认的
:win32
,则不需要激活和睡眠

下面是一个使用
:ms_uia
适配器的完整工作示例:

win = RAutomation::Window.new :title => /Opening rautomation/, :adapter => :ms_uia
win.send_keys :enter

file_dialog = RAutomation::Window.new :title => /Enter name of file/
file_dialog.button(:value => "&Save").click
要在第一个对话框中单击“取消”而不是“确定”,您可以使用
Window#close
,就像我在测试上面的窗口一样

我建议您使用
:ms_uia
适配器,而不是
:win_32
,因为它每天都在变得更稳定,并且在不久的将来将成为新的默认适配器

要将
:ms_uia
适配器设置为默认适配器,可以在加载RAUTOMATION自身之前使用环境变量
RAUTOMATION\u adapter
,如下所示:

win = RAutomation::Window.new :title => /Opening rautomation/
p win.present?
p win.controls.length
p win.text
win.close
ENV["RAUTOMATION_ADAPTER"] ||= :ms_uia
require "rautomation"

对于我的情况,我必须发送两个:tab键,然后发送:enter以保存文件。比如:

driver.get "http://rubygems.org/gems/rautomation-0.9.2.gem" 
window = RAutomation::Window.new :title => /Opening/i
if window.exist?
  window.activate
  window.send_keys :tab;
  sleep 2;
  window.send_keys :tab;
  sleep 2;
  window.send_keys :enter
end
我不知道为什么我不能用以下命令保存文件:

window.activate; sleep 1; window.send_keys :enter

这个代码对我有用:

window = RAutomation::Window.new(:title => /Opening rautomation-0.9.2.gem/i)
              window.activate
              p window.exists? # => true
              sleep 2
              window.send_keys(:down)
              window.send_keys(:enter)

这是什么样的系统弹出窗口?请打开链接-?你会看到一个我想用rautomation处理的弹出窗口。打开链接时我也看不到任何弹出窗口。你使用什么浏览器?如果你在FirefoxJarmo中打开链接,你会看到弹出窗口,你能帮我理解我是做错了还是这是一个错误吗?如果你在Firefox上打开链接,你会看到弹出窗口。我这样做是为了学习。我想在这里学习的是如何使用RAutomation处理系统弹出窗口。非常感谢您提供如此详细的信息!!!我尝试使用不同类型的对话框,但对于每个对话框,win.controls.length返回0。这意味着这些对话框不使用本机windows控件。现在,我正在搜索使用本机windows控件的对话框。希望我能很快得到它。例如,你可以使用任何Windows应用程序的对话框(例如,画图)。如果我的答案是有帮助的,那么请将其设置为一个可接受的答案。谢谢Jarmo,再次感谢你帮助我更好地理解RAutomation!!!我接受了答案:)