【C#】Ubuntu20.04でSeleniumを使う

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

コード

コードはこちらの記事の使いまわしです

【C#】Selenium を使ったWebスクレイピング
Selenium というツールを使うことで、RPAのようにWebアプリケーションのテストを自動化したり、任意のWebサイトからスクレイ…

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環境用の発行方法はこちらの記事にまとめています

【C#】.NET 6 のコンソールアプリをLinux上で動作させる
.NET Core以降からマルチプラットフォーム化したとのことで、WindowsだけでなくLinuxやMacでも動くようになりました。…

.NETランタイムのインストールが面倒なので、自己完結で単一ファイルを生成します

コードのデプロイ

クライアントツールのファイル転送機能を使って、任意の場所にコピーします

動作確認

Ubuntu上で実行すると、下記のように出力されることが確認できました

Leave a Reply

Your email address will not be published. Required fields are marked *