ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

Selenium.CefSharp.Driver_β をリリースしました。

CefSharpのブラウザを操作できるSelenium.CefSharp.Driverをリリースしました。
後は使いながら調整していく感じです。
Nugetから取得できるので是非つかってください!

github.com

そもそもCefSharpとは?

まずそこからですよねー。WpfとかWinFormsにChromiumを組み込むためのライブラリです。これ自体が超絶ニッチなライブラリです。そしてそれを操作するSeleniumとかどこまでもマニアック。

ChromeDriverでは動かせないの?

アプリ自体がブラウザみたいなやつは頑張ったら動かせるらしいんですけど、例えばアプリの途中でボタン押したらブラウザでてくるとかは無理みたいです。なんだけど、わざわざ組み込むんだからブラウザだけってなくね?ってわけで動いている奴にアタッチして操作できるものにしました。

アーキテクチャ

シンプルで以下3つの組み合わせです。

  1. Friendly
  2. JavaScript
  3. key Mouse エミュレート

まあ、僕がつくるんだからFriendlyは使いますよね・・・。ChromiumWebBrowserのAPIみて「こんだけでければ何とかなるやろ」ってので始めました。WebBrowserExtensionsのExecuteScriptAsyncってメソッドがあってJavaScriptを呼び出せるんですよね。これが決め手で大部分の処理はJavaScriptでまかなってます。僕はJavaScriptそんな詳しくないんでk-maruさんに手伝ってもらいました。Key Mouse エミュレートなんですけど、これは Friendly.Windows.KeyMouseを使っていてタイミングは調整しています。

サンプルコード

アタッチした後は普通にSeleniumインターフェイスで操作できます。

//Friendlyでアタッチ
var app = new WindowsAppFriend(process);

//普通にFriendlyの操作でウィンドウを取得
var window = app.Type<Application>().Current.MainWindow;

//そこに定義されている変数を取得、ドライバ作成
var driver = new CefSharpDriver(window._browser);

//あとは普通にSeleniumの操作
_driver.Url = "https://www.test.co.jp/";

//idから検索
var button = _driver.FindElement(By.Id("testButtonClick"));

//click.
button.Click();

//名前から検索
var textBox = _driver.FindElement(By.Name("nameInput"));

//キー操作
textBox.SendKeys("abc");

//タグから検索
var select = _driver.FindElement(By.TagName("select"));

//Selenium Supportも使える
new SelectElement(select).SelectByText("Orange");

//XPathから検索
var buttonAlt = _driver.FindElement(By.XPath("//*[@id=\"form\"]/table/tbody/tr[7]/td/input[2]"));

//Actoionsも使える
new Actions(_driver).KeyDown(Keys.Alt).Click(buttonAlt).Build().Perform();

//もちろんJavaScriptも呼び出せます。
var defaultValue = (string)_driver.ExecuteScript("return arguments[0].defaultValue;", textBox);

使えない機能

  1. IHasInputDevices
  2. IOptions
  3. IHasCapabilities

これらは使えません。IHasInputDevicesは実装しても良かったけど、なんだか非推奨になってたのでやめました。でも後は頑張って実装したのでそれなりに使えます。WindowとかFrame,Alertも無理やり対応しました。

WebDriverではない

重要なのはいわゆるWebDriverのプロトコルは使ってなくてそれに似せてるだけです。だから動きもChromeDriverと全く同じかといわれるとそうではない。でも十分実用に耐えるレベルを目指しています。実際に弊社のお客さんのとこでも使ってもらってます。なんで否が応でもそれなりの品質になります。よろしければ是非使ってみてください。

そして建設的なフィードバックをお待ちしております(時事ネタ