スポンサーリンク

[C#]Seleniumの使い方(スクレイピングメモ)

C#+Seleniumをいろいろ試してみたのでメモ。
Seleniumのインストールはこちらの記事を見てください。

C# + Selenium ためしてみた
マイクロソフトの公式ドキュメントでSeleniumを使ってC#でEdgeを操作しているサンプルがあったのでためしてみたので紹介。NuGetからSelenium.WebDriverをインストールして使います。Seleniumとは?...

画像のダウンロードについてはこちら、

[C#] 画像をダウンロードして保存する(HttpClient)
C#で画像をダウンロードして保存する方法を紹介します。System.Net.Http.HttpClientにあるGetAsyncメソッドでウェブからレスポンスを取得し、そこからReadAsStreamAsyncメソッドでストリームを取得し...

はじめに

まずはテンプレート的(ブラウザで指定したURLを開くだけ)なやつ。
適時、ドライバーのパスとかURLを変更してください。

using OpenQA.Selenium;
using OpenQA.Selenium.Edge;

//msedgedriver.exeがあるフォルダパス
var driverPath = @"D:\AppPortable\WebDriver";
var service = EdgeDriverService.CreateDefaultService(driverPath);

//コンソールを非表示に設定
service.HideCommandPromptWindow = true;

//ヘッドレスモード(ブラウザ非表示)を指定
var option = new EdgeOptions();
option.AddArgument("headless");

//ブラウザで開くURL
var url = "https://bing.com";

var driver = new EdgeDriver(service, option);
try {
    //ブラウザでページを開く
    driver.Url = url;
}
finally {
    //ブラウザを閉じる
    driver.Quit();
}

要素の取得

条件に該当する要素を1つ取得する場合はFindElementメソッド
条件に該当する要素を全て取得する場合はFindElementsメソッドを使う。

FindElementメソッドは条件に該当した最初の要素を1つ返す。
FindElementsメソッドは条件に該当した要素が入った読取専用リストを返す。

戻り値の要素もFindElementメソッド、FindElementsメソッドを持っているのでさらにその要素配下の検索ができる。

var rootElement = driver.FindElement(By.Id("test"));
var childElement = rootElement.FindElement(By.Name("yasnote"));

var elements = driver.FindElements(By.CssSelector("div[class='test']"));
foreach (var e in elements) { 
    var child = e.FindElement(By.Name("yasnote"));
}

それぞれ引数にはOpenQA.Selenium.Byで要素の検索方法を指定する。
選択できるのは以下、

説明
By.Id(“id属性値”)指定したidを持つ要素を取得
By.Id(“id-999”)
<div id=”id-999″></div>
By.LinkText(“リンクテキスト名”)指定したリンクテキストを持つ要素を取得
By.LinkText(“リンク”)
<a href=”xxxx”>リンク</a>
By.PartialLinkText(“リンクテキスト名の一部”)指定した文字列を含むリンクテキストを持つ要素を取得
By.PartialLinkText(“ンク”)
<a href=”xxxx”>リンク</a>
By.Name(“name属性値”)指定したname属性値を持つ要素を取得
By.Name(“nnnn”)
<div name=”nnnn”></div>
By.ClassName(“class属性値”)指定したclass属性値を持つ要素を取得
By.ClassName(“cccc”)
<div class=”cccc”></div>
By.TagName(“タグ名”)指定したタグ名を持つ要素を取得
By.TagName(“div”)
<div id=”id-999″></div>
By.XPath(“xpath”)指定したxpath構文を使って要素を取得
By.CssSelector(“cssセレクタ”)指定したcssセレクタを使って要素を取得

属性の取得

GetAttributeメソッドを使う。引数に属性名を指定する。
指定した属性が見つからない場合はnullが返ってくる。あればstring。

//要素を取得
var rootElement = driver.FindElement(By.Id("test"));

//href属性の値を取得
var attr = rootElement.GetAttribute("href");

要素の操作

クリック

選択した要素のClickメソッドを使う

var element = driver.FindElement(By.Id("main"));
element.Click();

テキスト・キーの入力

選択したinput要素のSendKeysメソッドを使う。
テキストは”abc”のように指定し、キーはOpenQA.Selenium.Keysを使う
検索ボックスにテキストを入力してエンターキーはこんな感じ

//input要素を取得
var element = driver.FindElement(By.Id("gsc-i-id1"));
//テキストを入力してエンターキー
element.SendKeys("あいう" + Keys.Enter);

select要素(リスト)の操作

こんなhtmlを想定

<html>
<head></head>
<body>
    <select id="dropTest">
        <option value="one">Item1</option>
        <option value="two">Item2</option>
        <option value="three">Item3</option>
        <option value="four">Item4</option>
        <option value="five">Item5</option>
    </select>
</body>
</html>

select要素を取得して操作するには、OpenQA.Selenium.Support.UI.SelectElementを作成する必要がある。もしかすると「Selenium.Support」の参照を追加する必要があるかも、

リストを選択する

選択は3つのメソッドが用意されている。

//using OpenQA.Selenium.Support.UI;

//select要素を取得
var element = driver.FindElement(By.Id("dropTest"));
//Select専用のオブジェクトを作成
var selectObj = new SelectElement(element);

//インデックスを指定して選択
selectObj.SelectByIndex(1);
//valueを指定して選択
selectObj.SelectByValue("four");
//テキストを指定して選択
selectObj.SelectByText("Item5");

選択されているリストの要素を取得

SelectElementのSelectedOptionプロパティで取得できる

//using OpenQA.Selenium.Support.UI;
//select要素を取得
var element = driver.FindElement(By.Id("dropTest"));
//Select専用のオブジェクトを作成
var selectObj = new SelectElement(element);
//テキストを指定して選択
selectObj.SelectByText("Item5");

//選択されているoptionを取得
IWebElement selectedOp = selectObj.SelectedOption;
Console.WriteLine(selectedOp.Text);                     //Item5
Console.WriteLine(selectedOp.GetAttribute("value"));    //five

リストの選択肢を取得

SelectElementのOptionsプロパティで取得できる。要素が入ったリストが返ってくる。

//using OpenQA.Selenium.Support.UI;
//select要素を取得
var element = driver.FindElement(By.Id("dropTest"));
//Select専用のオブジェクトを作成
var selectObj = new SelectElement(element);

//Optionsプロパティで選択肢を全て取得
foreach (var o in selectObj.Options) { 
    Console.WriteLine(o.Text);
}

随時追加予定

参考ページ

Seleniumクイックリファレンス
本サイトはSelenium入門者を対象とした、Seleniumの環境構築・APIの早見表サイトです。テスト自動化ツールであるSeleniumを使ったテスト方法についてご紹介いたします。
WebDriver
WebDriver drives a browser natively, learn more about it.

C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント