【C#】Selenium WebDriverでブラウザ操作を自動化してみた

業務でしている申請がめんどくさかったのでC#でSeleniumWebDriverを使用して自動化しまた。その時に学んだことをまとめました。

Seleniumでできること

ブラウザの操作を自動化できます。たとえば、”このページをクリックして、このフォームに***という文字を入力する。そのあとOKボタンをクリックする”こうった操作をコードで表現できます。

C#Seleniumを使用するためには

gazee.net

今回はVisualStudio2017を使用しました。Visual Studio上からNuGetを使用して以下のソフトウェアを導入します。

これだけで準備は完了です。あとは実装していきます。

コーディング内容の説明

ドライバ情報を変数に格納

var chrome = 
new ChromeDriver(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));

URLの選択

chrome.Url = "http://xxxxxxxxxx";

指定したURLに飛ぶことができます。

入力フォームに文字を入力

chrome.FindElementByName("xxxx").SendKeys("yyyy");

まずポイントとしては、FindElementByNameで、このByNameを使用すると開いているページのHTMLのname情報に対して検索をかけることができます。その検索対象の指定を"xxxx"に記述します。"yyyy"は入力したい文字列を記述します。タグの情報は下記を選択して確認します。
f:id:c_taquna:20190526235527j:plain:w200

f:id:c_taquna:20190527000409j:plain:w600

入力フォームの文字を削除する

chrome.FindElementById("xxxx").Clear();

入力するときに、削除しておかないと文字の追加になってしまうので、SendKeys("yyyy")の前に実施すると良いかもしれません。

ボタンをクリックする

chrome.FindElementByClassName("xxxx").Click();

FindElementByClassNameはByNameと同じように開いているページのclassに対して検索を行います。Click()はそのまま対象をクリックします。

操作対象をより具体的に選択する

chrome.FindElementByXPath("//a[@title='xxxx']").Click();

たとえば、選択したい要素のタグに記載されている情報が、他の要素とかぶっていてうまく一意に選択できないといった場合があります。そういったときは、FindElementByXPathを使用します。

たとえば上記に記載したものはaタグのtitleがxxxxになっているものをクリックという意味になります。

chrome.FindElementByXPath("//div[@class ='xxxx']/div[@id='yyyy']/input[@id='zzzzz']").Click(); ;

別の例を出すと、div でxxxxというclassの情報を持つタグで、その中にあるidがyyyyの情報をもつdivで、さらにその中にあるidがzzzzのinputを選択するといった書き方ができます。

スクリーンショットを撮影する

chrome.GetScreenshot().SaveAsFile(@"C:\Screenshot\"  + year + "_" + month +  ".png");

このように、保存先を指定することでスクリーンショットを取得することができます。エビデンスで使用できるかなと。ブラウザによってキャプチャの範囲が違うそうなのですが、まだそこまでは確認していないです。(他のサイトで説明がたくさんあった気がします)

感想

これは一例ですが、他にもできるこはありますし、下記に書いた参考書にはSeleniumを使用するときの設計方法についても書かれているので読むと勉強になるかと。

参考書

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)