C#とseleniumで小さなアプリを作ってみよう
Pythonを使い、seleniumでブラウザの自動操縦を行っていました。
しかし、pythonでは、他の環境にアプリを簡単にインストールするためのexe化や、プログラム速度が重いので、Cでできないかと考えていました。
その結果、C#のwindowsアプリで作成するというアプローチに至りました。
C#も10年以上使用していないため、開発環境が大幅に変化しているのに驚きつつ、まずはミニマムなプログラムを作成しようと思い、実用性のないGUIを備えたseleniumアプリを作成してみました。
仕様
・GUIとしてボタンがある。
・ボタンクリックでseleniumを使用してgoogleをブラウザで開く。
・なにもせず、ブラウザを閉じる。
意味のないシンプルなアプリです^^;
シンプルですな・・・
開発環境について
visual studio comunity 2019:C#で実装
selenium:Nugetから取得
chrome web driver:Nugetから取得
※seleniumをC#のプロジェクトにNugetで組み込む方法は、4の「seleniumを試す」で説明しています。
※chromeバージョンは74で検証しました。
※2020/1/21 chromeバージョン79で検証しました。「その他追記」の①に、仕様変更がありましたので、追記しました。
GUIを作る。
①プロジェクトの作成
②GUIを作る
プロパティで、ボタンの見た目を整える。
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をダウンロードしてバージョンを合わせていましたが、この点はすごくわかりやすく、楽だなと思いました。
所感
雑なアプリを作成してしまいましたが、スタンドアロンなアプリとして開発できる点が良いなと感じています。このアプリを拡張してpythonのアプリを移植したいと思います。
参考
シンプルなGUIアプリのチュートリアル
https://qiita.com/Kosen-amai/items/f9e3df2aa80363f5af5b
C#でseleniumの使用
https://gazee.net/develop/csharp-selenium-chrome-driver/
その他追記
①「ソフトウェアにより自動制御されています」というバーを消す。
アプリの初期化時などで、以下を呼び出します。
※chromeバージョン74時点では以下の記載方法
var options = new ChromeOptions(); options.AddArgument("--disable-infobars");
chromeバージョン76以降では以下のようになったようです。
var options = new ChromeOptions(); options.AddExcludedArgument("enable-automation"); options.AddAdditionalCapability("useAutomationExtension", false);
②クロームが立ち上がる時のコマンドプロンプトを消す。
アプリの初期化時などに以下のコードを呼び出します。
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); }