C#とSeleniumを用いたWebブラウザの自動操作について

こんなことできます
くつな

Webシステムを操作していると、「画面入力を自動化できたら便利なのに」と思う場面は少なくありません。

今回紹介するSelenium(セレニウム)は、Microsoft EdgeやGoogle Chromeといったブラウザ上で、ログイン、ボタンクリック、フォーム入力などの操作をプログラムから再現できるツールです。
Webアプリケーションのテスト自動化やクローリング・スクレイピング、RPA業務など、幅広い用途で活用されています。
また、無料で利用できるオープンソースのためライセンス費用を抑えつつ、高精度なWebアプリケーションの自動化を実現したい企業や開発チームにとって非常に有力な選択肢となります。

本記事では、そんなSeleniumとC#を使用したWebブラウザ操作を自動化する方法について紹介していきます。

Seleniumとは

Seleniumは、Webブラウザの操作を自動化するための強力なオープンソース・フレームワークです。主な特徴として、以下の点が挙げられます。

  • DOMを直接操作するためUI変更に強く、高速で安定したブラウザ操作が可能です。
  • プログラミングで柔軟なロジックを構築することで複雑な業務フローに対応できます。
  • 2004年の初期リリース以降、長期に渡った開発により豊富な知見と活発なコミュニティが形成されています。
  • PythonやJava、C#など多くのプログラミング言語に対応しており、既存のプロジェクトやスキルに応じた導入が容易です。
  • Selenium 4 以降、Selenium Managerにより自動でドライバ管理が可能となり、導入がさらに簡単になりました。

開発環境

今回、以下の構成で開発および動作確認をしていきます。

  • Windows 11
  • Microsoft Edge(145.0.3800.58)
  • Visual Studio 2026 Professional(18.4.2)
  • .NET 10.0
  • Selenium.WebDriver(4.41.0)
  • Selenium.Support(必要に応じて)

開発準備

Visual Studioでプロジェクトを新規作成

  1. Visual Studioを起動する。
  2. ウィンドウ上部のメニューから「ファイル」→「新規作成」→「プロジェクト/ソリューション」を選択する。
  3. 「コンソール アプリ(C#)」を選択して「次へ」ボタンを押下する。
  4. 任意のプロジェクト名・保存先ディレクトリを入力して「次へ」ボタンを押下する。
  5. ターゲットフレームワークを選択して「作成」ボタンを押下する。

無事に新しいプロジェクトが作成されました。

NuGetからSeleniumを導入

  1. プロジェクト名を右クリック して「NuGet パッケージの管理」を選択する。
  2. 「参照」タブを選択してインストールするパッケージを検索・選択し、バージョンを選択して「インストール」ボタンを押下する。
    インストールするパッケージ

    • Selenium.WebDriver(4.41.0)
    • Selenium.Support(必要に応じて)

こちらも無事にインストールされ、「インストール済み」タブからも参照できるようになりました。

実装サンプル

ここからはSeleniumでEdgeブラウザを操作するためのサンプルコードをいくつか紹介します。
詳細は割愛しますが、Chromeブラウザも「EdgeDriver」→「ChromeDriver」に置き換えることでほぼ同様に自動化できます。

ブラウザ起動

実行するとブラウザが立ち上がり、指定したWebページが開きます。
土台部分のサンプルはこんな感じでしょうか。用途に応じて、InPrivateモードの利用や画面非表示、プロキシ設定などもお試しください。

using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Support.UI;

namespace BrowserOperatorApp
{
  internal class Program
  {
    static void Main(string[] args)
    {
      EdgeOptions options = new EdgeOptions();
#if false
      // InPrivateモード(セッション情報を残さない)
      options.AddArgument("--inprivate");
#endif
#if !DEBUG
      // ヘッドレスモード(画面非表示)
      options.AddArgument("--headless=new");
      options.AddArgument("--disable-gpu");
#endif
      options.AddArgument("--window-size=1920,1080");
#if false
      // プロキシ設定
      Proxy proxy = new Proxy
      {
        // プロキシの手動設定
        Kind = ProxyKind.Manual,
        // http接続時にプロキシ設定を参照
        HttpProxy = "your-proxy-server:port",
        // https接続時にプロキシ設定を参照
        SslProxy = "your-proxy-server:port",
      };
      options.Proxy = proxy;
#endif

      // ディレクトリ設定
      string workDir = Path.Combine(Path.GetTempPath(), Process.GetCurrentProcess().ProcessName);
      Directory.CreateDirectory(workDir);

      // ブラウザを起動
      using (EdgeDriver driver = new EdgeDriver(options))
      {
        driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
        try
        {
          // 指定したURLを開く
          driver.Navigate().GoToUrl("https://bing.com");
          // 要素の読込完了を待機
          driver.FindElement(By.Id("sb_form_q"));
          Thread.Sleep(5000);
#if DEBUG
          Console.WriteLine("起動成功");
#endif
        }
#if false
        catch (WebDriverTimeoutException ex)
        {
          Console.WriteLine("待機時間が長すぎます。rn{0}", ex);
        }
        catch (NoSuchElementException ex)
        {
          Console.WriteLine("要素が見つかりません。rn{0}", ex);
        }
        catch (StaleElementReferenceException ex)
        {
          Console.WriteLine("要素の参照が有効ではありません。rn{0}", ex);
        }
        catch (ElementClickInterceptedException ex)
        {
          Console.WriteLine("要素を正しく参照できません。rn{0}", ex);
        }
#endif
        catch (Exception ex)
        {
          try
          {
            // スクリーンショットを保存
            Screenshot ss = ((ITakesScreenshot)driver).GetScreenshot();
            ss.SaveAsFile(Path.Combine(workDir, $"err_{DateTime.Now:yyyyMMddHHmmssffffff}.png"));
          }
          catch
          {
            // 何もしない
          }
          Console.WriteLine("予期せぬエラーが発生しました。rn{0}", ex);
        }
        finally
        {
          // ブラウザを閉じる(usingを使用しているので省略可)
          driver.Quit();
        }
      }
    }
  }
}

画面操作

さきほどのサンプルに少し手を加えてみます。
表示されるまで待った検索ボックスに対して文字を入力して検索するようになります。

          // 要素の読込完了を待機
          IWebElement searchBox = driver.FindElement(By.Id("sb_form_q"));

          // 検索ボックスに文字列を入力
          searchBox.Click();
          searchBox.SendKeys(Keys.Control + "a");
          searchBox.SendKeys(Keys.Delete);
          searchBox.SendKeys("WebDriver");
          searchBox.Submit();

※Google検索をはじめ、一部のサービスやシステムでは自動操作を制限している場合があります。
これは、自動操作の(予期せぬ?)挙動がシステムに高負荷をかける可能性を避けるため、予め対策が施されていることが理由です。
このような制限を無理に突破するのではなく、そのサービスの方針に従って必要に応じた他の方法を検討しましょう。

ファイルダウンロード

更にサンプルを改造してみます。
標準設定ではファイルをダウンロードする時に確認ダイアログが表示されますが、確認を無視して自動でダウンロードするように設定を追加してみます。

※実行環境により、組織設定が優先されて確認ダイアログが表示されてしまう場合があります。

      // ディレクトリ設定
      string workDir = Path.Combine(Path.GetTempPath(), Process.GetCurrentProcess().ProcessName);
      string downloadDir =
        Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), Process.GetCurrentProcess().ProcessName);
#if DEBUG
      Console.WriteLine($"ブラウザ設定格納先ディレクトリ: {workDir}");
      Console.WriteLine($"ファイル保存先フォルダ: {downloadDir}");
#endif

      if (Directory.Exists(workDir))
      {
        Directory.Delete(workDir, true);
      }
      Directory.CreateDirectory(workDir);
      Directory.CreateDirectory(downloadDir);

      // ブラウザ設定格納先の設定
      options.AddArgument($"--user-data-dir={workDir}");
      // 設定の上書き許可
      options.AddUserProfilePreference("download.directory_upgrade", true);
      // ダウンロード先ディレクトリの設定
      options.AddUserProfilePreference("download.default_directory", downloadDir);
      // ファイルダウンロード時の確認ダイアログを無効化
      options.AddUserProfilePreference("download.prompt_for_download", false);
      // セーフブラウジングを有効化
      options.AddUserProfilePreference("safebrowsing.enabled", true);
      // セーフブラウジングによる危険なダウンロードのブロックを無効化
      options.AddUserProfilePreference("safebrowsing.disable_download_protection", true);
      // 連続ダウンロードを許可
      options.AddUserProfilePreference("profile.default_content_setting_values.automatic_downloads", 1);
      // ポップアップを許可
      options.AddUserProfilePreference("profile.default_content_setting_values.popups", 1);
      // ダウンロード制限を無効化
      options.AddUserProfilePreference("download.restrictions", 0);

      // ブラウザを起動
      using (EdgeDriver driver = new EdgeDriver(options))
      {
          // ファイルダウンロード
      }

続いて、ダウンロードボタンを押下後、ファイルのダウンロード先に指定したディレクトリを監視して正しくダウンロードできたかどうか判定するようにしてみます。

         // 指定したURLを開く
          driver.Navigate().GoToUrl("https://example.com");
          driver.SwitchTo().DefaultContent();
          // ダウンロード前のファイル群を参照
          string[] beforeFiles = Directory.GetFiles(downloadDir);

          // ダウンロードボタンを押下
          IWebElement downloadBtn = driver.FindElement(By.Id("downloadBtn"));
          downloadBtn.Click();

          // ファイルダウンロード状況を監視
          using (ManualResetEventSlim completed = new ManualResetEventSlim(false))
          using (FileSystemWatcher watcher = new FileSystemWatcher
          {
            Path = downloadDir,
            Filter = "*.crdownload",
            NotifyFilter = NotifyFilters.FileName,
            IncludeSubdirectories = false,
          })
          {
            // ファイル削除を検知
            watcher.Deleted += (s, e) =>
            {
              completed.Set();
            };
            // ファイル名変更を検知
            watcher.Renamed += (s, e) =>
            {
              completed.Set();
            };

            watcher.EnableRaisingEvents = true;
            if (!completed.Wait(TimeSpan.FromSeconds(60)))
            {
              throw new TimeoutException("ファイルダウンロードがタイムアウトしました。");
            }
          }

          // ファイル名を取得(ダウンロード前後の差分から)
          Console.WriteLine($"ダウンロードファイル: {Directory.GetFiles(downloadDir).Except(beforeFiles).FirstOrDefault()}");

Webブラウザ操作を自動化するための事前調査

操作を自動化するにあたってHTML要素の属性(id、name、など)を把握しておく必要があります。
ここではMicrosoft Edgeの開発者ツールを使って対象のHTML構造を確認する方法を紹介します。

  1. 自動化したいWebページを開く。
  2. Microsoft Edgeの開発者コンソールを開く。(F12キー または Ctrl + Shift + I)
  3. 開発者コンソールの左上にある矢印アイコン(Select an element ~)を選択し、ページ上の要素をクリックして選択すると、開発者コンソール上のHTMLタグがハイライトされる。
    (例)Googleの検索ボックスの要素には、name属性に”q”の値を持つことが分かります。

まとめ

本記事では、C#とSeleniumを利用してWebブラウザの操作を自動化するための開発環境構築から基本操作までを紹介しました。

  • Seleniumを使うことで、Web上の操作を自動化できる。
  • プログラミングによる各操作は、数行のコードで記述できる。
  • 開発者ツールを使うことで、効率的に自動化対象を調査できる。

手動業務を効率化したい場合、Seleniumの活用は有力な選択肢のひとつになるのではないでしょうか。
業務の効率化やテスト自動化を検討している方へ、導入や開発のヒントとして本記事を活用していただければ幸いです。

お問い合わせはこちら

記事を書いた人

くつな

アニメやゲームが趣味。

関連記事

TOP