デスクトップアプリにするなら自動売買の処理とかPythonで作るよりC#(.Net)の方が作りやすくて見やすくね?
って思ったのでC#でボタンを押したらブラウザが立ち上がり自動処理が開始するまでのやり方を書き残して置こうかと。
使用していくのは「Google chrome」と「VisualStudio2022」。
そもそもそう思うのはC#に慣れているから、とか
Pythonにわかじゃんw、とか言われたら何も言い返せないんだけど。
経緯
2~3年前に初めてPythonを触り、初めてブラウザを自動操作する「Selenium」を知った。
その時はチケットを自動購入するデスクトップアプリを作ってみたのだが、作りながら思ったことがある。
GUIを作るのが面倒くさい。GUIは「PySimpleGUI」を使用してたのだがレイアウト調整が自由に出来ない。
実行ファイルを作るのが面倒くさい。実行ファイルの作成には「PyInstaller」を使用したが組み込むライブラリによってはspecファイルを明示的に書き込んでやらないといけなかった。
そして作成した実行ファイルのサイズがやたらめったら大きかった。
だけどそれらの面倒がVisualStudioでC#(.Net)を使用しWindowsFormsを作成すれば解決する。
そしてC#でも「Selenium」は使用できる。
GUIを用意する
VisualStudioなら作成プロジェクトを選択すれば画面は自動的に生成される。
「新しいプロジェクトの作成」から「Windowsフォームアプリ」を作成。
任意のプロジェクト名と保存先を入力して
フレームワークを選択(今回は.Net8.0)
これでもうアプリ画面のベースが用意される。
必要であれば右クリックからプロパティを開いてサイズと名称を変更する。
必要なパッケージのインストール
「ctrl+Alt+L」でソリューションエクスプローラーを開いてプロジェクト名を右クリックし、「NuGetパッケージの管理」を選択。
「参照」のタブから「Selenium.WebDriver」「WebDriverManager」をインストール。
「WebDriverManager」ブラウザの自動更新などに
「Selenium.WebDriver」はブラウザ操作全般の機能が入っている。
バージョンはデフォルトで最新の安定版になっているはずなので変更しなくてもOK。
これで準備は終わり。
実処理
画面に配置した「Button」をダブルクリックするとソースコードにクリックイベントが自動で生成される。
このソースを以下のように書き換える。
そのままコピペでも問題ないはず。
using WebDriverManager.DriverConfigs.Impl;
using WebDriverManager.Helpers;
using WebDriverManager;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium;
using AngleSharp.Dom;
namespace WinFormsTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//ドライバ自動更新
new DriverManager().SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser);
}
/// <summary>
/// 自動生成されたクリックイベント
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
// メイン処理
ClickMain();
}
/// <summary>
/// ボタンがクリックされた際のメイン処理
/// </summary>
private void ClickMain()
{
//WebDriverManagerが保存した場所
string driverVersion = new ChromeConfig().GetMatchingBrowserVersion();
string driverPath = $"./Chrome/{driverVersion}/X64/";
// ドライバの準備
using (ChromeDriverService driverService = ChromeDriverService.CreateDefaultService(driverPath))
{
// コンソール画面が表示されないように非表示
driverService.HideCommandPromptWindow = true;
// その他オプション
var options = new ChromeOptions();
// options.AddArgument("--start-maximized"); // 全画面表示にしたり
// options.AddArgument("--window-position=-32000,-32000"); // 表示位置を画面外にしたり
//ドライバの起動
using (ChromeDriver driver = new ChromeDriver(driverService, options))
{
// 指定URLを表示
string url = "https://www.google.co.jp/";
driver.Navigate().GoToUrl(url);
Thread.Sleep(1000); // 1秒待機
// 検索
IWebElement keyElement = driver.FindElement(By.XPath("//*[@id=\"APjFqb\"]"));
keyElement.SendKeys("ハムスターとチョコレート"); // 検索内容入力
Thread.Sleep(1000); // 1秒待機
keyElement.SendKeys(OpenQA.Selenium.Keys.Enter); // Enterで検索
Thread.Sleep(5000); // 5秒待機
}
}
}
}
}
これをF5でデバックを開始し配置されたボタンを押下すると、Googleが立ち上がって検索するまでが自動で進んでいく。
検索内容の入力欄も追加
ついでに、画面にテキストボックスを追加し検索内容を変更できるようにしてみる。
ツールボックスから「TextBox」を追加して
60行目の処理を以下のように修正するだけ。
keyElement.SendKeys(textBox1.Text); // 検索内容入力
これだけでボタンを押すことでテキストボックスに入力した内容をGoogleで検索するまでの自動化処理が出来た。
実際に動かしてみる。
この処理を応用すれば
・例えば複数サイトで同一の内容を入力する
・指定時間になったらチケットを購入する
といった自動処理を組み立てることが出来る。
さいごに
実はインストールしたパッケージ「Selenium.WebDriver」には「WebDriverManager」と同じ機能も存在する。
ただ「Selenium.WebDriver」でブラウザの自動更新の機能を使うとコンソール画面が表示されたりして使いがってが悪く思ったので「WebDriverManager」も一緒にインストールした。
それにしてもやっぱりスクレイピングや自動入力操作だけならC#で問題ない気がする。
むしろGUIの事を考えるならPythonに拘らずにVisualStudioでC#(.Net)を使用しWindowsFormsを作成した方が楽じゃないかなー…。
なにか気になることがあればコメントいただければと思います。
コメント