〇 edgeをプログラムから操作する

■ edgeをデバッグモードで起動させる方法
edgeの元となったプログラムのChromiumにはデバッグの仕組みがあるそうで、
それを利用するとプログラムからブラウザを自由に操作できるようです。
まずは、下調べをするとします。

▼ コンソールから次のコマンドを実行してみます

taskkill /F /IM msedge.exe
"c:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=80

1行目のコマンドがedgeを全て閉じるコマンドで2行目がデバッグモード ポート80番でedgeを起動するコマンドです。

▼ 次にもう一つブラウザを開いて次のアドレスを読み込みます
そうするとアタッチ可能なターゲット一覧が取得できるようです。

http://localhost:80/json/list

デバッグ先のブラウザのページを変えるとアタッチ可能なターゲット一覧も変化します。
これによりページの状態を取得できるようです。
→この方法はなんの役にも立ちませんでした。


■ WebDriverを使ってみる方法
色々調べて行くとブラウザの操作には対象ブラウザ専用のWebDriverというものがあり、それを起動して操作するようです。
ドライバーとのアクセスにはHTTPプロトコルが使用されているようで、
Edge用のWebDriverをダウンロードして 解凍した中に含まれていたファイル msedgedriver.exe を実行してみました。


現在のドライバがポート57955で待機しているという表示が出ていますがこの数字は毎回変わります。
待機しているポート番号にTCP/IP クライアントで接続してみました。

該当ポート番号にPOSTした所、エラーが返ってきました。


▼ C#でブラウザをコントロールする
C#などでブラウザを操作するには、先にダウンロードしたWebDriverとSeleniumが必要なようで、
Selenium.WebDriverのサイトからSeleniumをダウンロードします。
4.1.0ダウンロード
ダウンロードしたファイルの拡張子が .nupkg になっていますので .zip に変更して開きます。
selenium.webdriver.4.1.0.zip → lib → net48 を開き、 WebDriver.dll を取り出します。
これで msedgedriver.exe と WebDriver.dll が揃いましたので、C#を使ってプログラムを行いたいと思います。


▼ C#の開発環境
Visual Studio Community 2022
個人の開発者向けの無料のフル機能のIDEを私は使用しました。

まず、新規でC#のデスクトップアプリケーションを作成します、そのままビルドしてプロジェクトのフォルダ内の bin → Debug を開き、 msedgedriver.exe と WebDriver.dll をコピーします。
次に、ボタンをフォームに貼り付けてイベントを作成して次の赤文字部分(Microsoftのサンプルコードそのままですけど)を追加します。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using OpenQA.Selenium;
using OpenQA.Selenium.Edge;
using System.Threading;

namespace WpfApp4
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var driver = new EdgeDriver();
            try
            {
                driver.Url = "https://bing.com";

                var element = driver.FindElement(By.Id("sb_form_q"));
                element.SendKeys("WebDriver");
                element.Submit();

                Thread.Sleep(5000);
            }
            finally
            {
                driver.Quit();
            }
        }
    }
}
このままではエラーが出てコンパイルできませんので、 プロジェクト → COM参照の追加 により先ほどコピーした WebDriver.dll を追加します。

コンパイルして実行しボタンを押すとedgeが開いて動作している事が確認できます。

WebDriver.dllのバージョンを変えてみると実行時にこのようなエラーが出ました。



▼ ブラウザを操作する
URLを開く→文字列を入力→ボタンを押す→文字を取得
この一連の操作が自動化できれば大概のサイトには対応できそうです。
そこで、Googleのサイトを開き一連の操作をして検索するプログラムを作成しました。
using OpenQA.Selenium;
using OpenQA.Selenium.Edge;

〜ここに色々あって〜

EdgeDriver driver;
private void Form1_Load(object sender, EventArgs e)
{
    driver = new EdgeDriver();

    try
    {
        //googleを開く
        driver.Url = "https://google.com";

        //検索窓に文字列と入力する
        driver.FindElement(By.Id("APjFqb")).SendKeys("文字列");

        //検索候補が表示されるためTABキーを押して消す
        driver.FindElement(By.Id("APjFqb")).SendKeys(OpenQA.Selenium.Keys.Tab);

        //テキストの文字を取得する
        this.Text = driver.FindElement(By.ClassName("MV3Tnb")).Text;

        //検索ボタンをクリックする
        driver.FindElement(By.Id("gbqfbb")).Click();
    }
    finally
    {
    }
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
    //全てのウィンドウを閉じる
    driver.Quit();
}
Id や ClassName は Edgeの開発者ツールで調べる事ができました。
textBox1.Text = driver.PageSource;
によりページのソースを見てみるのもありかもしれません。


▲トップページ