PowerShellでIE操作〜Google検索編

f:id:IsThisAPen:20180729082213p:plain:w300

POINT

  • PowerShell+IEでGoogle検索する方法について紹介.
  • ドラッグ&ドロップでPowerShellスクリプトを実行するバッチファイルも作成する.

PowerShellを使ってIEを操作してみました.ポイントを備忘録として残しておきます.



PowerShellを使えば,IEだけではなくExcel操作も自動化できます:

PowerShellを実行するためのバッチファイル

このバッチファイルにhogehoge.ps1をドラッグ&ドロップすることで,スクリプトが実行できます.どんなPowerShellスクリプトにも適用できます.デスクトップにおいておき,実行したいPowerShellスクリプトをドラッグ&ドロップして実行すると良いでしょう.

@echo off
Powershell -ExecutionPolicy RemoteSigned -File %1
pause

Google検索するスクリプト

Googleからkeywordを検索するPowerShellスクリプトです.PowerShellでIEを操作する練習に作成しました.以下の手順で実行できます:

  1. 以下を"GoogleSearch.ps1"という名称で保存.
  2. 上で作成したバッチファイルにドラッグ&ドロップする.
  3. IEが起動しGoogle検索が実行される.


最初は短いコードだったのですが,環境が変わっても安定して動作させることを考えて書き直すうちに長くなってしまいました...

$url = "https://www.google.co.jp/"
$keyword = "PowerShell"

# シェルを取得/Internet Explorerの起動
$shell = New-Object -ComObject Shell.Application
$ie = New-Object -ComObject InternetExplorer.Application

# HWNDを記憶
$hwnd = $ie.HWND

# $urlへ移動
$ie.Navigate($url)

# ページが完全に切り替わるのを待つ
# (インターネットに接続されていない場合はループし続ける)
while ($ie.busy -or $ie.readystate -ne 4){
    Start-Sleep -Milliseconds 100
}
while ($true){
    # IE画面操作を行うためのドキュメントオブジェクト取得
    $ie = $shell.windows() | ? {$_.HWND -eq $hwnd} # ?はWhere-ObjectのAlias
    $doc = $ie.Document
    
    # $searchが取得できたらループを抜ける
    $search = $doc.getElementById("lst-ib")
    if ($search -ne [System.DBNull]::Value){break}

    Start-Sleep -Milliseconds 100
}

# Googleの検索窓に$keywordを入力
# (これでも良い:$search.value = $keyword)
$search.setAttribute("value",$keyword)

# 検索ボタンをクリック(valueで判定)
($doc.getElementsByTagName("input")|where{$_.value -eq "Google 検索"}).click()

# Internet Explorerを表示する。
$ie.Visible = $true

ポイント

安定して動作させるためにはそこそこ工夫が必要です.私は,「処理の順序によってエラーが変わるのは,読み込み待ちがないことが原因」だとわかるのに時間がかかりました*1
  • getElementByIdが取得できないうちに次の処理に進むとエラーになるので,読み込み待ちは必須.但し,このコードではループを抜けたあとにインターネット接続が切れるなどするとアウト.
  • ieをshell.Windows()で定義し直すと,保護モードの設定に依らずIEが操作できるらしい(参考:PowershellでInternetExplorerを操作する - Qiita).google検索だけなら,保護モードの設定が影響したことはない(と思っている)けど,他サイトに流用する場合を考えてこうしておく.ちなみに,IEの保護モードは,[インターネットオプション]>[セキュリティ]>[保護モードを有効にする]という手順で有効にできる.うまく動かない際は試して見る価値あり.
  • 検索ボタンをクリック(valueで判定)する方法について:

    ($doc.getElementsByTagName("input")|where{$_.value -eq "Google 検索"}).click()
    

    は以下のようにも書ける:

    $inputElements = $doc.getElementsByTagName("input")
    Foreach($inputElement in $inputElements) {
        if ($inputElement.value -eq "Google 検索") {
            $inputElement.click()
        }
    }
    


参考記事

*1:「IE起動→読み込み→処理」ではIEを起動できないうちに読み込みを行うためエラーが出てしまう.これに対し,「IE起動→処理→読み込み」では処理している間にIEが起動するため読み込みがうまくいく場合がある.