PowerShellでWEB操作を自動化する。


こんにちは、Mottyです。

ほとんどの人がWEB操作はマウスやトラックパッドで行っていると思いますが、あるページである操作を行うなど、動作があらかじめ決まっていれば自動化することが可能です。また一度組んでしまえば再利用できるので、ルーチンワークや反復作業であればあるほどWEB操作を自動化するメリットは大きいと言えますね！

今回はPowershellについて記述してみました。
![ps3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/c25d1199-3c11-c726-e939-06544cee3336.png)


### 0.PowerShellについて軽く説明
Powershellはマイクロソフトが開発したプログラミング言語です。Microsoft公式ドキュメントではPowershellについて以下のことが書かれています。

:::note info
PowerShell は、コマンドライン シェル、スクリプト言語、および構成管理フレームワークで構成されるクロスプラットフォームのタスク自動化ソリューションです。 PowerShell は Windows、Linux、および macOS 上で実行されます。
:::

要するに、PC作業におけるルーチンワークや反復動作を自動化する際のソリューションツールだと言っています。実際、powershellはオフライン環境の作業やWebの自動化、Excelの操作やメールの送受信などpowershellが担うことのできる範囲は広いです。

特徴1.クロスプラットフォームで動く

上記文言にも出ていましたが、”クロスプラットフォーム”であることが特徴として挙げられます。
簡単に言うと、WindowsでもMacでも動くよ！ということです。
(MacOSでは標準搭載されていませんが、開発環境は[こちら](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-macos?view=powershell-7.2)からダウンロードできます。)

VBScriptやバッチはそうはいかないですね。標準搭載されてる言語の中ではWindowsのみで動く言語も多いため、このような位置づけが特徴となっています。

特徴2.開発環境の構築が必要ない
一般にプログラミング言語を動かそうと思うと、動かすためのドライバーをインストールしたり、開発用のエディタやライブラリをインストールする必要がありますが、Windowsではpowershellはもとから入っています。
Windows10の検索ボックスに"powershell"と入力すると、powershellとpowershell ISE(開発環境)が出てくるのがわかります。
![2022-05-01 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/d75c69b3-60ef-757d-06e3-edb1a5cecdb4.png)

特徴3.オブジェクト指向である
Powershellはオブジェクト指向です。変数はオブジェクトに格納され、メソッドによって型を調べることができます。
-Powershell-
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/22bd95aa-6ced-152d-572c-80c26bff8fa9.png)
-PowerShell ISE-
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/3e17a839-a19a-39fe-58da-b6d689c8bc5a.png)
```sample.ps1
#変数には$マークをつける
$name = "Motty"
$name.GetType()

$age = 30
$age.GetType()

$IsMale = $TRUE #Powershellではbool値には$マークをつける
$IsMale.GetType()

```
実行結果↓
```output
IsPublic IsSerial Name                                     BaseType                                                                                    
-------- -------- ----                                     --------                                                                                    
True     True     String                                   System.Object                                                                               
True     True     Int32                                    System.ValueType                                                                            
True     True     Boolean                                  System.ValueType      
```

当然、オブジェクトをユーザー定義して扱うこともできます。
非オブジェクト指向言語のバッチファイルに比べて、いろいろと便利です。
（例えばフォルダ内のファイルを一括で取得する場合、FOR文を回す必要がないなど）

ここから下では実際にpowershellを使った自動化作業について記述していきます。

### 1.自動検索
基本的なケースから見ていきましょう。googleで検索するにあたって重要なのは、要素の取得方法です。
![aga.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302420/3b64b842-c993-e95b-7f31-1c526fc5e136.png)

検索窓に対して自動的に"one piece"と入力したいとき、検索窓のElementの取得する必要があります。これはブラウザの開発者ツールで調べることができます。
タグを調べると、以下のようにでてきます

```html
<input class="gLFyf gsfi" jsaction="paste:puy29d;" maxlength="2048" name="q" type="text" aria-autocomplete="both" aria-haspopup="false" autocapitalize="off" autocomplete="off" autocorrect="off" autofocus="" role="combobox" spellcheck="false" title="検索" value="" aria-label="検索" data-ved="0ahUKEwiXlKe_zb33AhWICaYKHZMPAIoQ39UDCAY">
```

要素の取得方法は以下４つあります。
・ID名を取得して、GetElementById("要素名")で取得する。
・nameを取得して、GetElementsByName("要素名")で取得する。
・Class名を取得して、GetElementsByClassName("要素名")で取得する。
・タグ名を取得して、GetElementsByTagName("要素名")で取得する。
上記ではclass("gLFyf gsfi")とname("q")が割り振られています。今回はよりシンプルな名前が割り振られているnameで取得しましょう。

```powershell
$txt = $objIE.Document.GetElementsByName("q")
$txt[0].value = "one piece" #値を挿入
```

次はクリックするボタンの要素を取得します。今回は検索ボタンですね！
要素は以下になります。
```html
<input class="gNO89b" value="Google 検索" aria-label="Google 検索" name="btnK" role="button" tabindex="0" type="submit" data-ved="0ahUKEwiXlKe_zb33AhWICaYKHZMPAIoQ4dUDCA8">
```

```powershell
$btn = $objIE.Document.GetElementByName("btnK")
$btn[0].click()
```

以上、web操作をするにあたって、まずは要素を正しく取得することにフォーカスして説明しましたが、全体のソースコードは以下のようになります。
```sample1.ps1
$objIE = New-Object -ComObject InternetExplorer.Application #InternetExprolerオブジェクトの生成
$objIE.Visible = $true 
$objIE.Navigate("https://www.google.com/")

#ページが読み込まれるまで待機
while ($objIE.Busy -or $objIE.readyState -ne 4) {
    Start-Sleep -Milliseconds 200
}

$strSearch = "one piece" #検索文字
$txt=$objIE.Document.getElementsByName("q")[0].value = $strSearch #検索窓に文字列を挿入
$btn=$objIE.Document.getElementsByName("btnG") #ボタンオブジェクトの取得
$btn[0].click() #クリック

```

ちなみにページを遷移させるときはページが読み込まれるまで待機させておくことは非常に重要になります。
読み込みが完了していない時点でGetElements～～～などのメソッドで要素の取得を試みると、要素が見つからずにオブジェクトエラーが返ってくるからです。


### あとがき
PowerShellはwebもExcelも比較簡単に操作でき、変数を介して連携もできることがわかりましたね。
もちろんVBAでもできるのですが、Excelを立ち上げてマクロを実行する、という手順を踏まなければいけません。一方でpowershellは右クリックで実行できるので、手順はより簡便ではないかなとも思います。
ただし操作できるブラウザがInternetExplorerというところが難点です・・・Chromeを操作しようと思えばWebDriverであるSeleniumをダウンロードする必要があるのですが、またの機会に記載したいと思います。

--引用--
Microsoft公式ドキュメント
https://docs.microsoft.com/ja-jp/powershell/scripting/overview?view=powershell-7.2