C#アプリからUbuntu上でSeleniumを使う方法をまとめます。
以前Seleniumを使う記事を書いた際にdriverのバージョンを手動で更新する必要があると記載していましたが、WebDriverManagerを使うことで自動で更新できるようになるようです。その使い方も含めて記載します。
環境構築にはVPSのWebARENA (Indigo)を利用しました。1時間単位の課金で非常に安価なためお勧めです
【検証環境】.NETCore3.1 / Console / Ubuntu20.04
Ubuntuでの作業
SSHで接続
最近知ったクライアントツールでrloginというのが便利なのでオススメです
SSH接続だけでなくファイル転送も可能で、ターミナルの分割表示などもできます
https://kmiya-culti.github.io/RLogin/
Chromeをインストール
https://inno-tech-life.com/dev/linux/ubuntu_chrome/
sudo apt update
sudo apt upgrade
# 適当なディレクトリに移動
cd ~/tmp
# .debダウンロード
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
# ローカルに保存された.debファイルからインストール
sudo apt install ./google-chrome-stable_current_amd64.deb
C#プロジェクトの作成
当初は.NET6で作成しようとしましたが、WebDriverManagerがうまく動かず、.NET Core3.1で作成しました
パッケージのインストール
WebDriverManager:driverのバージョン問題を解決してくれる(らしい)
Selenium.WebDriver
コード
コードはこちらの記事の使いまわしです
WebDriverManagerの使い方は下記サイトを参考にしました
https://teratail.com/questions/227899
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using WebDriverManager;
using WebDriverManager.DriverConfigs.Impl;
using WebDriverManager.Helpers;
namespace ConsoleApp
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("ChromeDriverを取得中");
// 最新版
//new DriverManager().SetUpDriver(new ChromeConfig());
// インストールされているバージョン
new DriverManager().SetUpDriver(new ChromeConfig(), VersionResolveStrategy.MatchingBrowser);
Console.WriteLine("ChromeDriverを取得終了");
// 起動オプションの設定
var options = new OpenQA.Selenium.Chrome.ChromeOptions();
// ヘッドレス(画面なし)
options.AddArgument("--headless");
options.AddArgument("--no-sandbox");
// ドライバ起動
using (var driver = new ChromeDriver(options))
{
// 対象のURL
var url = "https://pg-life.net/";
// URLへ遷移
driver.Navigate().GoToUrl(url);
// idで要素を取得
var newEntryBox = driver.FindElement(By.Id("new-entry-box"));
// classで要素を取得(複数あるためFindElements)
var newEntryItems = newEntryBox.FindElements(By.ClassName("new-entry-item"));
// 複数要素をループで一つずつ出力
foreach (var item in newEntryItems)
{
// classで要素を取得(単一のためFindElement)
var newEntryItemMeta = item.FindElement(By.ClassName("new-entry-item-meta"));
// Textプロパティで文言を出力
Console.WriteLine(newEntryItemMeta.Text);
}
}
}
}
}
ハマった点として、下記をオプションに追加する必要がありました
options.AddArgument("--headless");
options.AddArgument("--no-sandbox");
参考サイト
発行
Linux環境用の発行方法はこちらの記事にまとめています
.NETランタイムのインストールが面倒なので、自己完結で単一ファイルを生成します
コードのデプロイ
クライアントツールのファイル転送機能を使って、任意の場所にコピーします
動作確認
Ubuntu上で実行すると、下記のように出力されることが確認できました