C#+Seleniumをいろいろ試してみたのでメモ。
Seleniumのインストールはこちらの記事を見てください。
画像のダウンロードについてはこちら、
はじめに
まずはテンプレート的(ブラウザで指定した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);
}
随時追加予定
参考ページ
C# 記事まとめページに戻る(他のサンプルコードもこちら)
コメント