このダイアログの問題は、ネイティブの 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、または他の多くの自動化ツールを使用してコントロールを直接操作できないことを意味します。この種のダイアログを処理するために利用できる特定の自動化ツールがいくつかあるかもしれませんが、私にはわかりません。
ただし、これらの種類のウィンドウを操作するための回避策があります。必要なキーストロークをウィンドウに送信します。この場合、return/enter キーを送信すると、「OK」ボタンをクリックするのと同じことになるので、手動で試すことができます。
「OK」ボタンをクリックするのと同じように動作するコード例を次に示します。
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
最初のダイアログで「OK」ではなく「キャンセル」をクリックするにはWindow#close
、上記のウィンドウをテストするために使用していたのと同じように使用できます。
アダプターは日々安定しており、近い将来新しいデフォルトになるため、:ms_uia
代わりにアダプターを使用することをお勧めします。:win_32
:ms_uia
デフォルトのアダプターを設定するにはRAUTOMATION_ADAPTER
、RAutomation 自体を次のようにロードする前に環境変数を使用できます。
ENV["RAUTOMATION_ADAPTER"] ||= :ms_uia
require "rautomation"