サイトアイコン わんすけに聞いてみる

PowerShellでSelenium使わずWebDriver操作

昨日、Power Automateを初めて使ってみて軽く衝撃を受けた訳ですよ。

イマドキなクラウドサービスな訳ですけども、やっぱり感じるのはo365触れてると、ブラウザがどんどん高性能になってるなーってこと。

ほんで、導入もすこぶる簡単だ。

RPAソリューションに関わるお仕事させてもらってる身からすれば、やっぱり圧倒的な利便性の良さにため息が出てしまう訳ですよ。導入支援とか・・・いらないじゃん?

だからって、黙ってしてやられるだけじゃつまらねぇぜ!

 

アプリケーション制御にせよ、ブラウザ制御にせよ、仕様はすでに一般化されてるものな訳だから、誰にだってできるんだ!

そう、俺にだってデスクトップ操作やブラウザ操作なら作れるんだ。

勉強がてら、その辺の基礎的なところはお試しで触ったもんね。

これらのテストした時は、UIAutomationはVB.net、WebDriverはJavascriptでやってみた訳だけど、これらってPowerShellならどっちもできるんだよね。

つ・ま・り、Webブラウザ上でぽちぽちシナリオ作って、PowerShellをビルド・ダウンロード保存、ローカル実行できればデスクトップアプリとブラウザ制御の両方ができる無料のWebサイトが理論上は作れる訳だ。

やってやろうじゃないか、インストールすら不要の無料RPAでMicrosoftに対抗だ!!

 

っていうモチベーションで今日はPowerShellの勉強しましたーっていう長い長い前振りでした( ^ω^ )

 

さて、今日は、PowerShellでWebDriverを制御するのに使いそうな構文を調べて構文をザザザーっと用意しました。

 

1.プログラムの起動と停止

まず、WebDriverの起動と停止が必要ですね。

# WebDriverの起動
Start-Process -FilePath chromedriver.exe -ArgumentList port=9515

# WebDriverの停止
Stop-Process -Name chromedriver

 

2.HTTPリクエスト Get と Post

WebDriverでは、localhostにhttpでコマンドを発行するからね。

Httpリクエストする為の構文はこんな感じ。

# HTTPでGETリクエスト
Invoke-WebRequest リクエストURL

# HTTPでPOSTリクエスト(Json)
Invoke-RestMethod -Method POST -Uri リクエストURL -Body コンテント -ContentType application/json

 

3.HttpでJsonをPostするには下処理が必要だ。

都度やるの大変だからfunction化しておきましょうかね。

# Uriと連想配列を渡してJsonでPostするfunction
function Post-JsonContent($postUri,$body)
{
  $json = $body | ConvertTo-Json -Compress
  $postBody = [Text.Encoding]::UTF8.GetBytes($json)
  return Invoke-RestMethod -Method POST -Uri $postUri -Body $postBody -ContentType application/json
}

 

4.WebDriverが必ずあるとは限らんな。

基本PowerShellで全部やりたいけど、WebDriverだけは資材としてファイル分かれちゃうもんね。

ファイル存在確認の処理についても考えておこう。

Add-Type -AssemblyName System.Windows.Forms

# ファイル選択ダイアログ
function Get-FileFromDialog($filter,$title)
{
  $file_dialog = New-Object System.Windows.Forms.OpenFileDialog
  $file_dialog.Filter = $filter
  $file_dialog.Title = $title
  
  # ダイアログを表示
  if($file_dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
    return $file_dialog.FileName
  }else{
    [void][System.Windows.Forms.MessageBox]::Show("WebDriverが見つかりませんでした。","ブラウザ制御失敗","OK","Information")
    exit
  }
}

# ファイルの存在確認
$driver_exists = Test-Path chromedriver.exe
if($driver_exists -eq $true){
  $driver_path = chromedriver.exe
}else{
  $driver_path = Get-FileFromDialog "実行ファイル(*.exe)|*.exe" "WebDriverを選択してください"
}

$driver_name = [System.IO.Path]::GetFileNameWithoutExtension($driver_path)

Start-Processは、フルパスなんだけど、Stop-Processではプロセス名での指定だから一応$driver_pathと$driver_nameに分けておいた。

 

あとは、、、WebDriverの仕様見ながらコマンド確認しがら、それをくみ上げるUIをVueでページ上に組んでみるかーって感じだな。

案外、簡単な処理ならすぐできそうな気がしてきたぞっ。

この後、いろいろ勉強しました。続編はこちら↓↓↓

モバイルバージョンを終了