Winformsアプリケーション用のSeleniumドライバー
貢献は歓迎されます:)
このプロジェクトは使用しています
https://github.com/microsoft/winappdriverが既にあるのはなぜですか?私がテストしているアプリは多くの要素を備えた非常に大きく、そのドライバーはいくつかのXpathクエリで60秒後にタイミングを出していました(この問題を参照)。すべてをまとめた後、クエリは2秒未満で終了しました。
このプロジェクトは、Windows Accessibility APIの一部であるMS UI Automationに依存しています。
公式ドキュメントでは、さまざまなプラットフォームのサポートに言及しています。
UIの自動化は、Windows XP、Windows Server 2003、Windows Server 2003 R2、Windows Vista、Windows 7、Windows 10、Windows Server 2008、Windows Server 2008 R2、Windows Server 2012、Windows Server 2012 R2、Windows Server 2016、およびWindows Server 2019でサポートされています。
私は自分のマシンで10エンタープライズを獲得しているだけなので、これらのプラットフォームで動作することを確認できませんが、必要なライブラリはすべてプロジェクトの一部です。
私が知る限り、開発者モードは必要ありません。
現在、インストーラーはありません。リポジトリをクローンし、ソースから実行可能ファイルを構築します。 WinAppDriver.ServerbinDebugWinAppDriver.Server.exeの下にある実行可能ファイルを使用します
最新のクライアントドライバーバージョン3.141.0.0は、サーバーを呼び出すときに使用する必要があります。
Ok 。 Yes 、 acceptAlertButtonCaptions機能をセミコロン分離した値のリストを設定することで追加のキャプションを追加できますdismissAlertButtonCaptions機能をセミコロン分離した値のリストで設定することにより、compatedボタンを見つけるデフォルトのキャプションがCancel No 、追加のキャプションを追加できますサポートされていないセレンコマンド
XPathサポート:
//node[3] //node[@attribute = 'X'] このAppiumコマンドのみが実装されています
Selenium.WebDriverへの参照を追加します。Webdriverv3.141.0(https://www.nuget.org/packages/selenium.webdriver/3.141.0)を追加すると、準備ができています。
ドライバーは、テストプロセスの下でシステムを開始するか、実行中のプロセスに接続できます。機能を使用して、接続するプロセスを定義します。
コマンドライン引数が提供されていない場合、サーバーはデフォルトのIPアドレスhttp://127.0.0.1:4444で起動されます。
次の機能がサポートされています。
mode - start (デフォルト値)またはattachprocessId添付するプロセスのIDprocessName添付するプロセスの名前exePathまたはappプロセスを開始するための実行可能ファイルへのパス(現在、引数は提供できません)appWorkingDir新しいプロセスの作業ディレクトリを設定するmainWindowTitle winAppdriverがプロセスを絞り込むのに役立つ正規表現sendKeyStrategy ( oneByOne | grouped | setValue ) - テキストフィールドにテキストを入力するために使用する戦略、デフォルト値はoneByOneです。現在、この機能はセッション中に変更できません public static RemoteWebDriver CreateSessionByStartingTheApplication()
{
DesiredCapabilities desktopCapabilities = new DesiredCapabilities();
desktopCapabilities.SetCapability("app", "<name of the program to start>");
// or "exePath" desktopCapabilities.SetCapability("exePath", "<path to the executable to start the process>");
// following capabilities should be provided for UWP applications like Calculator or Clocks & Alarms
// optional - to set the working directory
desktopCapabilities.SetCapability("appWorkingDir", "<path to run the process in>");
// optional - to identify the process
desktopCapabilities.SetCapability("processName", "<name of the process>");
// optional - to identify the main window
desktopCapabilities.SetCapability("mainWindowTitle", "<name of the process>");
return new RemoteWebDriver(
new CommandExec(new Uri("http://127.0.0.1:4444"),
TimeSpan.FromSeconds(60)),
desktopCapabilities);
}
public static RemoteWebDriver CreateSessionByAttachingToRunningProcess()
{
DesiredCapabilities desktopCapabilities = new DesiredCapabilities();
desktopCapabilities.SetCapability("mode", "attach");
// attach to process using process name
desktopCapabilities.SetCapability("processName", "<name of the process to attach to>");
// with (optional)
desktopCapabilities.SetCapability("windowTitle", "<regular expression to narrow down the list of matching processes>");
// or attach to process using process id
desktopCapabilities.SetCapability("processId", "<id of the process to attach to>");
return new RemoteWebDriver(
new CommandExec(new Uri("http://127.0.0.1:4444"),
TimeSpan.FromSeconds(60)),
desktopCapabilities);
}
推奨要素の位置はXPath式を使用しています(ただし、式のサポートが限られています)
var webBrowser = session.FindElement(By.XPath("//Pane[@AutomationId='webBrowser']"));
サポートされている要素の位置メカニズム
TextBox#idWins in the WinアプリケーションのWindowsは、ブラウザのWindowsとは異なります。 Windows( ControlType.Window )は、 Tab要素など、コントロールツリー内にネストできます。
ウィンドウは、XPath Expression var window = session.FindElement(By.XPath("/Window/Pane/Window[@AutomationId='WindowName']"));または、 session.SwitchTo().Window("WindowName"); 、最初の例では、要素の参照を取得します。もう1つは、内部コンテキストが新しいウィンドウに切り替えられ、ウィンドウがsession.Close()クロードすると、次の操作中にキャッシュされます。
OpenQA.Selenium.Support.UI.SelectElementのような要素ラッパーは、内部的にselectとoption要素が予想されるため、機能しないことに注意してください。
XPath式を使用して子供のウィンドウを検索するときにウィンドウを切り替える必要性をバイパスする非常にugいハッキングがあります。デフォルトでは、検索はウィンドウのルート要素(メインウィンドウまたはユーザーが切り替えたウィンドウ)から始まり、現在のルートの直接の子ではなかったため、子ウィンドウの検索が失敗していました。修正は、上位レベルのウィンドウの検索を開始します。