はじめに
先日ネットサーフィンをしていたところ、面白そうなライブラリを見つけました。
これを用いることでChromeなどのブラウザを自動操作ができます。
何かの自動売買をしたりもできるみたいです。
今回は以下のようなものを作るのを目標にやっていきたいと思います。
準備をする
まずはVisualStudioを立ち上げ、C#のコンソールアプリを作成します。
Selenium
を使えるようにNuGet
より2つのパッケージをダウンロードします。
- Selenium.WebDriver
- Selenium.WebDriver.ChromeDriver
名前からもわかるかもしれませんが、Chromeを自動操作するのでChromeDriver
をダウンロードしています。
プロジェクト -> NuGet パッケージの管理
を選択してください。
以下の画像を参考にしながら先程の2つのパッケージを追加します。
また今回は依存関係はありませんが、必ずここをチェックする癖をつけておくと良いと思います。
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の開発者ツール(ディベロッパーツール)から確認することができます。
このように要素を探すためには以下の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
を用いることができるらしく、無料で定期的にブラウザ操作をしたり色々できるみたいです。
これを使えばサーバーも要らないですし、電気代等を含めても無料でできちゃいます。
ただ自動操作が規制されているサイトとかサービスもあるらしいので、そこだけは注意してください。
またサーバーに負荷をかけ過ぎるのも最悪逮捕される可能性があったりと危険なので注意しましょう。
ではまた。