Selenium (4.0.0)でスクショを撮るPowerShellスクリプト

# 1. 動機
業務上で新しい情報を探す時に定期的に見るサイトがあると思いますが、それを毎度自分でポチポチPCいじって巡回するのがめんどくさい…いうことで、スクショを撮ってメールか何かで送付することができる機能が欲しいな、と思って作ってみました。

但し実行するのは自己責任でお願いします。この記事による情報で作ったスクリプトからなんらかの被害を受けた場合、筆者に責任が来るということにはならない、ということでお願いします。

# 2. 準備1 - 適切なコマンドレットのあたりを付ける
まずSeleniumのコマンドレットを見ると下記。スクショに関連しそうなのはnew-SeScreenshotとSave-SeScreenshotの2つ。なのでこれを見てみることにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/d80a0453-7a80-5e24-9bf6-a4b28bd75c70.png)

ちなみにブラウザインスタンスを$driverという変数に入れてメンバーを見ると下記。スクショが撮れそうなメソッドはなかったので、コマンドレットでやる方法を探すことにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/b1fc12e9-4b9d-543a-865e-0165e3f8b2a4.png)

# 3. 準備2: New-SeScreenshot vs Seve-SeScreenshot
名前からは使い方がよくわからないこの2つのコマンドレットの概要と例は下記。Save-SeScreenshotのExample 1を見る限り、New-SeScreenshotでスクショオブジェクトができて、Save-SeScreenshotでそれを画像形式で保存できそう、ということが分かりました。なのでこれを早速試してみることにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343332/b2114fb0-984d-31dc-0f61-18a47e3800c0.png)

ちなみにヘルプの読み方は下記記事で解説してます。

https://qiita.com/_Sasaki_/items/2838dfb17586f70f9c84


# 4. スクリプト - ブラウザを立ち上げてそのページのスクショを画像として保存する

お試しで下記のスクリプト作ったらうまくいきました。
立ち上げたブラウザのスクショを撮ってDownloadsのフォルダに名前を付けて保存できます。
```PowerShell
$driver = Start-SeDriver -Browser Edge -StartURL 'スクショしたいサイトURLを入力' 
$screenShot = New-SeScreenshot
$pathImage= "\Users\Username\Downloads\適当なファイル名.jpeg'
Save-SeScreenShot -ImageFormat Jpeg -Path $pathImage -ScreenShot $screenShot
```


# 5. スクリプト - 複数のスクショを撮ってメールで送付する
保存する画像のファイル名に日付を入れ、それをサイトのリンクとともに送付するのは下記でできました。
しかし問題があって、最後のところでメモリ解放してるつもりでもなぜか解放されません…　タスクマネージャから消せばいいといえばいいですが、うまいやり方知っている方いたら教えてください。

```PowerShell
#Please change parameters
$To = "自分のメルアド@ドメイン" 
$CC = $null
$Body = "Link：適当なURL" #複数個やる場合にはエスケープシーケンスで改行するといいです
$dayNow = Get-Date -Format "yyyyMMdd"
$Subject = "適当なタイトル"

function SendMailByOutlook {

    $outlook = New-Object -Comobject Outlook.Application
    $mail = $Outlook.CreateItem(0)
    $mail.To = $To
    $mail.CC = $CC
    $mail.Subject = $Subject
    $mail.Body = $Body
    $mail.Attachments.Add("\Users\Username\Downloads\ファイル1つめ_$dayNow" + '.jpeg')
    $mail.Attachments.Add("\Users\Username\Downloads\ファイル2つめ_$dayNow" + '.jpeg') #無ければ消す　
    $mail.Attachments.Add("\Users\Username\Downloads\ファイル3つめ_$dayNow" + '.jpeg') #無ければ消す　
    $mail.Send()
}


#ブラウザスクショ撮影1回目
$driver = Start-SeDriver -Browser Edge -StartURL 'サイト1つめURL' 
$screenShot = New-SeScreenshot
$pathImage= "\Users\Username\Downloads\ファイル1つめ_$dayNow" + '.jpeg'
Save-SeScreenShot -ImageFormat Jpeg -Path $pathImage -ScreenShot $screenShot

Start-Sleep -Seconds 1 #ゆっくりStart-Sleepで待ってます

#ブラウザスクショ撮影2回目
$driver = Set-SeUrl 'サイト2つめURL' #Set-SeUrlコマンドレットはサイト変更するやつです
$screenShot = New-SeScreenshot
$pathImage= "\Users\Username\Downloads\ファイル2つめ_$dayNow" + '.jpeg'
Save-SeScreenShot -ImageFormat Jpeg -Path $pathImage -ScreenShot $screenShot

Start-Sleep -Seconds 1

#ブラウザスクショ撮影3回目
$driver = Set-SeUrl 'サイト3つめURL'
$screenShot = New-SeScreenshot
$pathImage= "\Users\Username\Downloads\ファイル3つめ_$dayNow" + '.jpeg'
Save-SeScreenShot -ImageFormat Jpeg -Path $pathImage -ScreenShot $screenShot

#ブラウザ終了
$driver.quit()

#メモリ解放
$driver = $null
$screenShot = $null
[GC]::Collect()

#メール送信
SendMailByOutlook
$mail = $outlook = $null
[GC]::Collect()  
```

# おわりに
基本自分用の備忘録ですが、何かの役に立てば幸いです。
ちまちまPowerShellの記事を書いているので、興味あれば私の他の記事も見てみてください。
私のスクリプトでイケてないところあったら是非教えてください。