Windows環境で開発をしている橋田です。
パスワード付きのプロキシーを設定していると、ネットワークアクセスの際にプロキシーの認証情報(ユーザー名/パスワード)を求められます。 Microsoft EdgeとGoogle Chromeを利用しているお客様から、ブラウザ使用中にプロキシーの認証情報入力ダイアログが表示された際に、認証情報を自動で入力したいという要望をいただきました。今回、この要望に応えるため、WindowsのUIオートメーションツールを使用して、Microsoft EdgeとGoogle Chromeのプロキシーの認証情報入力ダイアログに認証情報を自動で入力するツールを開発しました。
開発したツールはProxyDialogAutoFillerという名前でOSSとして公開しています。
この開発事例を元に、WindowsのUIオートメーションツールの基本的な使い方を紹介します。
既存のプロキシーの認証情報(ユーザー名・パスワード)の自動入力ツールとの比較
ChromeにはProxy Helperといったプロキシーのユーザー名/パスワードを自動入力する機能を搭載した拡張機能(アドオン)があります。しかし、拡張機能だけでは自動で入力できないタイミングが存在し1、取りこぼしが発生し得ます。
このような取りこぼしを回避するため、今回はWindowsのUIオートメーションツールを使用して、ブラウザの外部からブラウザ上に表示されるプロキシーの認証情報入力ダイアログを監視する仕組みとしました。
基本的な動作
基本的な動作として、まずProxyDialogAutoFiller(今回開発したツール)が常駐し、EdgeまたはChromeのプロセスが起動しているかどうか監視します。 EdgeまたはChromeのプロセスが起動している場合、UIオートメーションツールを使用して、そのプロセス上にプロキシーの認証情報入力ダイアログが表示されているかどうかを判定します。 プロセス上にプロキシーの認証情報入力ダイアログが表示されていた場合、UIオートメーションツールを使用して、保持しているユーザー名/パスワードをダイアログに入力します。
より詳しい動作の説明については、ProxyDialogAutoFillerのドキュメントに記載されているため、そちらを参照してください。
UIオートメーションの使い方
以下、今回のツールでのUIオートメーションの使用方法(実装方法)について解説します。
対象となるプロキシーの認証情報入力ダイアログの情報取得
基本的にユーザーインターフェイス(UI)の構成はプログラムによって異なり、どのような構成になっているのかは自分で調べるしかありません。
ProxyDialogAutoFillerでは、UIオートメーションツールを使用して、あるUI要素配下の全てのUI要素を文字列として出力するメソッドを作成しています。これを使用してプロキシーの認証情報入力ダイアログの構成を確認します。
まず、Edge上でプロキシーの認証情報入力ダイアログを表示します。

その状態で、上記のメソッドを使用して、Edgeのルート要素から全てのUI要素を出力します。 出力された内容から、プロキシーの認証情報入力ダイアログに表示されている内容と合致する部分を探します。 実際の確認結果は、以下のようになりました。
- ControlType.Window : 新しいタブ - 職場 - Microsoft? Edge
- ControlType.Pane : 新しいタブ - Microsoft Edge
- ControlType.Window : このサイトにアクセスするにはサインインしてください
- ControlType.Pane :
- ControlType.Pane :
- ControlType.Pane :
- ControlType.Text : このサイトにアクセスするにはサインインしてください
- ControlType.Pane :
- ControlType.Pane :
- ControlType.Pane :
- ControlType.Text : プロキシー http://localhost:3128 には、ユーザー名とパスワードが必要です。
- ControlType.Pane :
- ControlType.Text : ユーザー名
- ControlType.Edit : ユーザー名
- ControlType.Text : パスワード
- ControlType.Edit : パスワード
- ControlType.Pane :
- ControlType.Button : サインイン
- ControlType.Button : キャンセル
UIオートメーションツールを使用してダイアログの要素を探す
前節で確認したダイアログの内容に基づいて、UIオートメーションツールでダイアログの要素を検索します。
UIオートメーションツールでは、PropertyCondition、OrCondition、AndConditionといった検索条件を指定するオブジェクトを使用してUI要素を検索します。
前節の結果から、ダイアログについては、タイトルが「このサイトにアクセスするにはサインインしてください」、コントロールタイプがWindowであることがわかります。前述のオブジェクトを使用して、以下のように検索条件を作成し検索します。
var proxyDialogNameCondition = new PropertyCondition(AutomationElement.NameProperty, "このサイトにアクセスするにはサインインしてください");
var targetControlTypeCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);
var proxyDialogCondition = new AndCondition(
targetControlTypeCondition,
proxyDialogNameCondition);
var proxyDialogElement = targetRootElement.FindFirst(TreeScope.Subtree, proxyDialogCondition);
proxyDialogNameConditionがダイアログのタイトル(名前)の条件で、targetControlTypeConditionがコントロールタイプがWindowsであるという条件です。
proxyDialogConditionがこれら二つのAND条件です。最後にtargetRootElement.FindFirst(TreeScope.Subtree, proxyDialogCondition)で、この検索条件を使用してEdgeのルート要素から検索を実行しています。
UIオートメーションツールを使用してダイアログに値を入力し、サインインする
同様の要領で、前節で取得したダイアログ配下の、タイトルが「ユーザー名」である入力欄を検索します。
var userNameTitleCondition = new PropertyCondition(AutomationElement.NameProperty, "ユーザー名");
var editControlTypeCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit);
var userNameEditCondition = new AndCondition(
userNameTitleCondition,
editControlTypeCondition);
var userNameEditElement = proxyDialogElement.FindFirst(TreeScope.Descendants, userNameEditCondition);
さらに、取得した入力欄に値を入力します。ここでは、文字列を扱うコントロールであるValuePatternを使用して値を代入しています。
object valuePatternObj;
if (userNameEditElement.TryGetCurrentPattern(ValuePattern.Pattern, out valuePatternObj))
{
(valuePatternObj as ValuePattern).SetValue("テストユーザー");
}
これにより、「ユーザー名」入力欄に「テストユーザー」という名前が入力されます。
同様の要領で、「パスワード」入力欄への値の入力、「サインイン」ボタンをクリックを自動化します。
以上の手順により、UIオートメーションツールを使用しての自動サインインが実現します。
まとめ
ProxyDialogAutoFillerの開発事例を元に、WindowsのUIオートメーションツールの基本的な使い方を紹介しました。この記事が何らかの参考になれば幸いです。
クリアコードでは、このように、お客様の要望に応じたWindowsのデスクトップアプリケーションの開発なども行っております。また、その成果をOSSとして公開しております。 何かお困りのことがありましたら、ぜひお問い合わせフォームからお気軽にご相談ください。
-
例えば、ブラウザの起動から拡張機能が有効化されるまでに数秒~数十秒がかかることあり、その間に読み込まれたページでは、ユーザー名/パスワードを自動入力できません。 ↩