C#とseleniumでミニマムなGUIアプリ

Pythonを使い、seleniumでブラウザの自動操縦を行っていましたが、pythonのexe化や、プログラム速度などの関係で、Cでできないかと考えていました。その結果、C#のwindowsアプリで作成するというアプローチに至りました。

C#も10年以上使用していないため、開発環境が大幅に変化しているのに驚きつつ、まずはミニマムなプログラムを作成しようと思い、実用性のないGUIを備えたseleniumアプリを作成してみました。

1.仕様

・GUIとしてボタンがある。

・ボタンクリックでseleniumを使用してgoogleをブラウザで開く。

・なにもせず、ブラウザを閉じる。

意味のないシンプルなアプリです^^;

2.開発環境について

visual studio comunity 2019:C#で実装

selenium:Nugetから取得

chrome web driver:Nugetから取得

インストール等は省略。

3.GUIを作る。

①プロジェクトの作成

②GUIを作る

プロパティで、ボタンの見た目を整える。

4.seleniumを試す

①NuGetでseleniumuをプロジェクトに追加します。

Webで検索したやり方だと、ソリューションエクスプローラーに「依存関係」があって、そこを右クリックすると「NuGetパッケージの管理」があるんですが、最新のものでは、「参照」となっているんですね。

chromのバージョンに応じて、Selenium.Chrome.WebDriverを設定します。

②MainWindows.xaml.csにプログラムを追加

usingに以下を追加。

using System.IO;
using System.Reflection;
using OpenQA.Selenium.Chrome;

ボタンクリックイベントの関数にseleniumでgoogleを開くプログラムを追加。

private void Button_Click(object sender, RoutedEventArgs e)
{
   var chrome = new ChromeDriver(System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
   chrome.Url = @"http://www.google.com/";
   chrome.Quit();
}

※関数内部3行を追加

上記プログラムにより、ボタンをクリックすると、一瞬googleが開かれ、すぐに閉じる動作が確認できる。

実行時に、私の環境で、以下のエラーが出ました。

This version of ChromeDriver only supports Chrome version 74

google chromeブラウザアプリを開き、右上ボタンから、「ヘルプ」、「google chromeについて」を確認すると、バージョンが73.03…となっていました。自動でバージョンアップされ、chromeを再起動して74となったことを確認して実行したら解消できました。

pythonだと、自分でchromedriver.exeをダウンロードしてバージョンを合わせていましたが、この点はすごくわかりやすく、楽だなと思いました。

5.所感

雑なアプリを作成してしまいましたが、スタンドアロンなアプリとして開発できる点が良いなと感じています。このアプリを拡張してpythonのアプリを移植したいと思います。

6.参考

シンプルなGUIアプリのチュートリアル

https://qiita.com/Kosen-amai/items/f9e3df2aa80363f5af5b

C#でseleniumの使用

https://gazee.net/develop/csharp-selenium-chrome-driver/

7.その他追記

①「ソフトウェアにより自動制御されています」というバーを消す。

アプリの初期化時などで、以下を呼び出します。

var options = new ChromeOptions();
options.AddArgument("--disable-infobars");

②クロームが立ち上がる時のコマンドプロンプトを消す。

アプリの初期化時などに以下のコードを呼び出します。

var driverService = ChromeDriverService.CreateDefaultService();
driverService.HideCommandPromptWindow = true;

③クロームドライバーの使い方の流れ

1.クロームドライバーの挙動を設定する。

上記①と②の設定を行う。

2.クロームドライバーを準備する。(1.で指定した設定を反映させドライバーを作成、URLを指定する。)

ChromeDriver driver = new ChromeDriver(driverService, options);
driver.Url = @"https://google.com/";

3.クロームドライバーを操作する。

以下1行目が、ウィンドウサイズの指定(1280×800のウィンドウサイズに指定)、2行目が、Xpathで要素の選択。そして、クリック。

driver.Manage().Window.Size = new System.Drawing.Size(1280, 800);
driver.FindElement(By.XPath("//ここにXpath chromeで取得できる。")).Click();

サイト上のテキストボックスなどに自動入力する構文。

var txtbox = driver.FindElement(By.XPath("//*[@id='textbox']ここは、テキストボックスのXpath"));
txtbox.Clear();//内容を一度クリア
txtbox.SendKeys("テキスト");//テキストの送信

ボタンクリックのところに、以下の一連の処理を記述すると、ウィンドウサイズ1280×800のgoogleサイトを表示するアプリができる。

private void Button_Click(object sender, RoutedEventArgs e)
{
    var options = new ChromeOptions();
    options.AddArgument("--disable-infobars");
    var driverService = ChromeDriverService.CreateDefaultService();
    driverService.HideCommandPromptWindow = true;
    ChromeDriver driver = new ChromeDriver(driverService, options);
    driver.Url = @"https://google.com/";
    driver.Manage().Window.Size = new System.Drawing.Size(1280, 800);
}