はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【C#】Seleniumを使ってChromeを自動操作してみる

はじめに

先日ネットサーフィンをしていたところ、面白そうなライブラリを見つけました。

www.selenium.dev

これを用いることでChromeなどのブラウザを自動操作ができます

何かの自動売買をしたりもできるみたいです。


今回は以下のようなものを作るのを目標にやっていきます。

f:id:hanaaaaaachiru:20200306164304g:plain

準備をする

まずはVisualStudioを立ち上げ、C#のコンソールアプリを作成します。

f:id:hanaaaaaachiru:20200306132948p:plain

Seleniumを使えるようにNuGetより2つのパッケージをダウンロードします。

  • Selenium.WebDriver
  • Selenium.WebDriver.ChromeDriver

名前からもわかるかもしれませんが、Chromeを自動操作するのでChromeDriverをダウンロードしています。

プロジェクト -> NuGet パッケージの管理を選択してください。

f:id:hanaaaaaachiru:20200306133705p:plain

以下の画像を参考にしながら先程の2つのパッケージを追加します。

また今回は依存関係はありませんが、必ずここをチェックする癖をつけておくと良いと思います。

f:id:hanaaaaaachiru:20200306134442p:plain

f:id:hanaaaaaachiru:20200306134453p:plain

choromeを自動で開く

まずはこちらのコードを打ち込んで実行してみてください。

using System;
using System.IO;
using System.Reflection;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumTest
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            // Webドライバーのインスタンス化
            IWebDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

            // URLに移動します。
            driver.Navigate().GoToUrl(@"https://www.google.co.jp/");

            // なにかコンソールに文字を入力したらクロームを閉じる
            Console.ReadKey();
            driver.Quit();
        }
    }
}

正常に動けばChromeのホームページが自動で立ち上がるはずです。


このコードで注目する点は2つあります。

IWebDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

WebドライバーはC#等の言語と個々のブラウザ制御コードの実装の橋渡しをします。

つまりブラウザと通信するにはまずWebドライバーのインスタンスの作成が必須なので、最初の頃はおまじないだと思っても大丈夫です。

またいくつかのサイトでWebDriver型の変数に代入しているものを見かけましたが、基本はインターフェイスを用いましょう。
(スクリーンショットを撮るGetScreenshotメソッドなんかはIWebDriver内に定義がないみたいなのでWebDriverを使いましょう)

driver.Navigate().GoToUrl(@"https://www.google.co.jp/");

GoToUrlメソッドに引数に目的のURLを書くことでURLを開くことができます。

要素を探す

IWebElement element = driver.FindElement(By.Id("ここにIDを入力"));

このIDはChromeの開発者ツール(ディベロッパーツール)から確認することができます。

f:id:hanaaaaaachiru:20200306151109p:plain

このように要素を探すためには以下の8種類があるそうです。

ロケータ 詳細
class name class名に値を含む要素を探す (複合クラス名は使えない)
css selector CSSセレクタが一致する要素を探す
id id属性が一致する要素を探す
name name属性が一致する要素を探す
link text a要素のテキストが一致する要素を探す
partial link text a要素のテキストが部分一致する要素を探す
tag name タグ名が一致する要素を探す
xpath XPathと一致する要素を探す

この中でも一般的にはタグが推奨されています。

要素にテキストをセット,クリック,送信

sendKeyメソッドを使うことで要素にテキストをセットできます。

例えば検索するときに文字列をセットしたりですね。

driver.FindElement(By.Name("q")).SendKeys("はなちるのマイノート");


次にclickメソッドを使うことでクリックすることができます。

driver.FindElement(By.Name("q")).Click();


Chromeの文字を入力した後の送信はSubmitメソッドを用います。

driver.FindElement(By.Name("q")).Submit();

サンプル

今までのものを組み合わせて、冒頭の画像のものを作ってみましょう。

using System;
using System.IO;
using System.Reflection;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;

namespace SeleniumTest
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            // Webドライバーのインスタンス化
            IWebDriver driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

            // URLに移動します。
            driver.Navigate().GoToUrl(@"https://www.google.co.jp/");

            // 検索をするInputタグを取得
            IWebElement textbox = driver.FindElement(By.Name("q"));

            // テキストを打ち込む
            textbox.SendKeys("はなちるのマイノート");

            // 送信(検索)
            textbox.Submit();

            // 特定のURLを含むサイトを開く
            driver.FindElement(By.PartialLinkText("www.hanachiru-blog.com")).Click();
            driver.FindElement(By.ClassName("hatena-id-link")).Click();

            // なにかコンソールに文字を入力したらクロームを閉じる
            Console.ReadKey();
            driver.Quit();
        }
    }
}

さいごに

Google Apps ScriptでもSeleniumを用いることができるらしく、無料で定期的にブラウザ操作をしたり色々できるみたいです。

これを使えばサーバーも要らないですし、電気代等を含めても無料でできちゃいます。

ただ自動操作が規制されているサイトとかサービスもあるらしいので、そこだけは注意してください。

またサーバーに負荷をかけ過ぎるのも最悪逮捕される可能性があったりと危険なので注意しましょう。

ではまた。