此对话框的问题在于它不使用本机 Windows 控件。当您使用Spy++或AutoIt Window Info Tool时,它们也不会在该窗口中向您显示任何控件。
使用 RAutomation 时,您可以检查它是否具有本机控件,如下所示:
win = RAutomation::Window.new :title => /Opening rautomation/
p win.present?
p win.controls.length
p win.text
win.close
该脚本的输出将是:
true
0
""
换句话说 - 窗口存在,任何类型的控件都为零,文本是一个空字符串。此外,关闭窗口确实关闭了它,您可以直观地验证 - 这意味着我们正在与正确的窗口进行交互,而不是意外地与其他一些空窗口进行交互(注意:这有时也可能发生)。
这一切都意味着您不能直接使用 AutoIt、RAutomation 或许多其他自动化工具与控件进行交互。可能有一些特定的自动化工具可用于处理此类对话框 - 我不确定。
然而,有一种解决方法如何使用这些类型的窗口 - 将所需的击键发送到窗口。在这种情况下,发送返回/回车键就可以解决问题,因为这与单击“确定”按钮相同——您可以手动尝试。
这是示例代码,其工作方式与单击“确定”按钮相同:
win = RAutomation::Window.new :title => /Opening rautomation/
win.activate
sleep 1
win.send_keys :enter
我不确定为什么,但由于某种原因,您必须通过调用手动激活窗口Window#activate
并等待一秒钟,然后再发送该enter
密钥。
之后会弹出一个新对话框,该对话框使用本机 Windows 控件 - 您可以处理它,就像您最初期望 RAutomation 工作一样。
但是,如果您使用: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_ADAPTER
在加载 RAutomation 本身之前使用环境变量,如下所示:
ENV["RAUTOMATION_ADAPTER"] ||= :ms_uia
require "rautomation"