Selenium + VB.NET で RPA　3:Webフォームへの入力

自身が「Selenium + VB.NET」による自動化で学んだことをまとめた第三回目。（前回は[こちら] (https://qiita.com/k_airyuu/items/959d9819fb77ec6ac0d6)）

今回はWebフォームへの入力です。
日々の業務でフォームへの入力を行う場面は多々ありますが、今回はそのフォーム入力を Selenium と VB.NET を使って自動化してみます。

使用する入力フォームは、日本Seleniumユーザーコミュニティさんが設けているテスト用のページを利用させてもらいます。
http://www.selenium.jp/test-site
http://example.selenium.jp/reserveApp_Renewal/

<img width="500" alt="014.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/4dc1e00d-3842-672a-189d-16d25bba1389.png">


ホテルの予約システムを模したページとなっており、こちらへの入力を自動化してみます。
業務で使うWebアプリも似たような仕組みかと思いますので参考になると思います。

##1）コーディング
[前回](https://qiita.com/k_airyuu/items/959d9819fb77ec6ac0d6)作成した Visual Studio のプロジェクトを開き、ソリューションエクスプローラー内、Form1.vb を右クリックし、ビューデザイナーを選択します。
<img width="500" alt="011.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/d72e52f7-50cd-5e61-bc68-865241e48781.png">

するとForm1のデザイン編集画面が開くので、ツールボック内の「Button」を選択。続いてフォーム上でカーソルをドラッグさせ、ボタンを配置します。（処理開始用ボタン）
<img width="500" alt="012.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/cb323c51-ccc7-bc8e-e533-d28ae3c9435b.png">

次にソリューションエクスプローラー内、Form1.vb を右クリックし、「コードの表示」を選択します。
<img width="500" alt="013.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/ed64cf08-e03e-60eb-44d8-8d1938066ab3.png">

するとコードエディタが開くので、上部にあるドロップダウンリストから「Button1」「Click」を選択します。
これにより、フォーム上の「Button1」を「Click」することで、これから記述するコードが実行されるようになります。
<img width="500" alt="015.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/ab04a0a7-90f9-68a6-d86f-e71f8f5e07b9.png">


続いて具体的な処理を記述します。
現在コードエディタ上には以下の記述がされています。

```vb
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    End Sub
End Class
```


これにコードを追記し、下記条件の宿泊予約がWebフォームへ自動入力される仕組みを作ります。
・宿泊開始日：一週間後
・宿泊日数：3泊
・宿泊人数：2人
・朝食：なし
・追加プラン：お得な観光プランを追加
・予約者名：佐藤一郎

追記したものが以下になります。

```vb
'SeleniumをVB.NETで使うために必要な記述（Imports）
Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome
Imports OpenQA.Selenium.Support.UI

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        '「予約情報入力」のテストページを開く
        Dim driver As New ChromeDriver
        driver.Url = "http://example.selenium.jp/reserveApp_Renewal/"

        '変数を用意する
        Dim today As DateTime = DateTime.Today '今日の日付を格納する変数today
        Dim newday As DateTime = today.AddDays(7) '今日から7日後の日付を格納する変数newday
        Dim str As String = newday.ToString("yyyy/MM/dd") '7日後の日付を yyyy/MM/dd 書式の文字列にする
        Dim element As OpenQA.Selenium.IWebElement 'ウェブページの要素を格納する変数element

        'フォームへの入力
        '１）宿泊日の入力　⇒テキストボックスへの入力
        element = driver.FindElement(By.Id("datePick")) '要素を指定
        element.Clear() '既に日付されている「今日の日付」をクリアする
        element.SendKeys(str) '日付の入力欄に、今日から7日後の日付を入力する

        '２）宿泊日数の指定　⇒セレクトボックス内の選択
        element = driver.FindElement(By.Id("reserve_term")) '要素を指定
        Dim SelectDropdown As SelectElement = New SelectElement(element) 'インスタンス作成
        SelectDropdown.SelectByValue(3) 'セレクトボックスの中から、value属性の値を選択する（3泊なので「3」）。

        '３）宿泊人数の指定　⇒セレクトボックス内の選択
        element = driver.FindElement(By.Id("headcount")) '要素を指定
        SelectDropdown = New SelectElement(element) 'インスタンス作成
        SelectDropdown.SelectByValue(2) 'セレクトボックスの中から、value属性の値を選択する（2人なので「2」）。

        '４）朝食バイキングの有無指定　⇒ラジオボタンの選択
        element = driver.FindElement(By.Id("breakfast_off")) '要素を指定
        element.SendKeys(Keys.Space) '朝食なし を選択

        '５）プランの指定　⇒チェックボックスの選択
        element = driver.FindElement(By.Id("plan_b")) '要素を指定
        element.Click() 'お得な観光プラン を選択

        '６）名前の入力　⇒テキストボックスへの入力
        element = driver.FindElement(By.Id("guestname")) '要素を指定
        element.SendKeys("佐藤一郎") '氏名を入力する

        '７）確定ボタンの押下　⇒ボタンへのクリック
        element = driver.FindElement(By.Id("agree_and_goto_next")) '要素を指定
        element.Click() '同意ボタン をクリック

    End Sub
End Class
```
seleniumによるブラウザ操作でよく利用される、
__・テキストボックスへの入力__
__・ボタンのクリック__
__・ラジオボタンの選択__
__・チェックボックスの選択__
__・セレクトボックス内の選択__
が網羅されているので、いろいろと使いまわしが効くと思います。

##2）実行
実際に動かしてみます。
test\test\bin\Debug にある test.exe をダブルクリックし、下のウィンドウが出たら、Button1 を押下します。
<img width="236" alt="016.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/0aaae5fc-1ba0-4cef-7206-b9e40e5b5ba8.png">

数秒で予約完了画面が表示されます。
宿泊期間は「入力日のちょうど一週間後」が開始日になります。
<img width="500" alt="017.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575853/af021b7a-493f-82c1-4e0b-4b91253508b3.png">


##3）まとめ
今回は「たった一回の入力処理」を自動化しただけなので、手入力した場合と効率に大差はないですが、これが業務用のWebアプリによる、数十件、数百件の入力となった場合、
__入力情報をExcelファイルなどから抽出 ⇒ Webアプリへ入力__
の処理をループさせることで入力時間を大幅に短縮できると思います。

※もちろんこの手の入力には「入力情報を一括でアップロードできる仕組み」がシステム側にあってしかるべきですが…。