【PowerShell】Selenium-Module Start-SeChrome Chromeブラウザを開始する

目次

概要

 Selenium-ModuleでChromeブラウザを開始します。起動オプションが豊富に用意されています。

 PowerShellでSeleniumを利用するに当たって、ある程度簡易的にSeleniumを利用できる様に専用のモジュールがGitHubに用意されています。いきなりPowerShellでSeleniumを扱うより、Seleniumを-Moduleを利用した方が簡単にPowerShellでSleniumを利用することができます。環境構築するには、以下ページを参照してみてください。

コマンド(Commond)

Start-SeChrome

代替コマンド(Alias)

SeChrome

構文(Syntax)

Start-SeChrome [[-StartURL] <string>] [-Arguments <array>] [-HideVersionHint] [-DefaultDownloadPath <FileInfo>] [-ProfileDirectoryPath <FileInfo>] [-DisableBuiltInPDFViewer <bool>] [-EnablePDFViewer] [-Incognito] [-DisableAutomationExtension] [-BinaryPath <Object>] [-WebDriverDirectory <Object>] [-Quiet] [-AsDefaultDriver] [-ImplicitWait <int>] [<CommonParameters>]

オプション

Name引数型解説Short Example
StartURLstringChrome起動$Driver = Start-SeChrome -StartURL https://programan.org/
Argumentsarray複数引数を利用する場合$Driver = Start-SeChrome -Arguments @('Incognito','start-maximized')
HideVersionHintWrite-Verboseによるchromeのバージョンヒントを隠す$Driver = Start-SeChrome -HideVersionHint
DefaultDownloadPathFileInfoデフォルトのダウンロードパス設定$Driver = Start-SeChrome -DefaultDownloadPath $dir
ProfileDirectoryPathFileInfoプロフィールパスを指定して起動$Driver =Start-SeChrome -ProfileDirectoryPath "$env:LOCALAPPDATA\Google\Chrome\User Data"
DisableBuiltInPDFViewerboolデフォルトで$true設定。手動で設定はしない
EnablePDFViewerPDFビューアをセット$Driver = Start-SeChrome -StartURL "https://www.jka.or.jp/jka-news-pdf/jka-no34-pdf10mb/" -EnablePDFViewer
Incognitoシークレットモードの設定$Driver = Start-SeChrome -Incognito
DisableAutomationExtension「〜自動化で制御」非表示と拡張機能の自動更新回避Start-SeChrome -DisableAutomationExtension
BinaryPathObjectChromeの起動ファイルをオブジェクトパス指定
指定のChromeバージョンを利用する場合に使用
Start-SeChrome -BinaryPath "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
WebDriverDirectoryObjectChromeDriverのフォルダパスをディレクトリ指定$Driver = Start-SeChrome -WebDriverDirectory "C:\Users\48745\Downloads\chromedriver_win32"
QuietターミナルのDriverServiceコマンドを非表示$Driver = Start-SeChrome -Quiet
AsDefaultDriver現在のドライバーをデフォルトドライバーとして設定$Driver = Start-SeChrome -AsDefaultDriver
ImplicitWaitint暗黙的な待機時間の設定$Driver = Start-SeChrome -ImplicitWait 20 -Quiet
CommonParameters共通パラメータ
Headlessヘッドレスモードで起動$Driver = Start-SeChrome -Headless -StartURL https://programan.org/
Maximized画面最大化で起動$Driver = Start-SeChrome -Maximized
Fullscreenフルスクリーンで起動$Driver = Start-SeChrome -Fullscreen
Minimized画面最小化で起動$Driver = Start-SeChrome -Minimized

※ShortExampleは、動作確認ができたコードを記載しています。

オブジェクトプロパティ

Name出力例
FileDetector         OpenQA.Selenium.DefaultFileDetector
NetworkConditions    
Url                  data
Title                
PageSource           <html><head></head><body></body></html>
CurrentWindowHandle  9CAFD1A38D064F68CF1306FA76CC7C96
WindowHandles        {9CAFD1A38D064F68CF1306FA76CC7C96}
Keyboard             OpenQA.Selenium.Remote.RemoteKeyboard
Mouse                OpenQA.Selenium.Remote.RemoteMouse
HasWebStorage        False
WebStorage           
HasApplicationCache  False
ApplicationCache     
HasLocationContext   False
LocationContext      
Capabilities        省略
SessionId            
IsActionExecutor     True

Example

 使用例として、空手協会のPdfリンクテキストをクリックしてPdfファイルをダウンロードする方法を紹介します。Selenium-Moduleの場合、デフォルト設定でPdfファイルリンクのクリックはPdfビューアを開かず、ダウンロードする設定になっております。

$shell = New-Object -ComObject Shell.Application
$DownloadDir = $shell.NameSpace("shell:Downloads").Self.Path
$searchDir = $DownloadDir + "\*.pdf"
$BaseFile = Get-ChildItem -Path $searchDir

$Driver = Start-SeChrome -DefaultDownloadPath $DownloadDir -StartURL "https://www.jka.or.jp/jka-news-pdf/jka-no34-pdf10mb/"
$Element = Find-SeElement -Driver $Driver -PartialLinkText "JKAニュース No34"
Invoke-SeClick -Element $Element

$flg = $false
do {
    $CompFile = Get-ChildItem -Path $searchDir
    $diffResult = Compare-Object $BaseFile $compFile -IncludeEqual
    foreach($data in $diffResult) {
        $indicator = $data.SideIndicator
         # CompFileに存在し、BaseFileには存在しないデータ
         if($indicator -eq "=>") {
            echo $data.InputObject
            $flg = $true
            break
        }else {
            $flg = $false
        }
    }
} until ($flg -eq $true)

Start-Sleep -Seconds 2
SeClose $Driver
1行目

Shell.Applicationクラスの生成

2行目

NemaSpaceメソッドにより、ダウンロードフォルダのディレクトリパスを取得

3行目

ダウンロードフォルダ内のPDFファイルを格納

4行目

ダウンロード前の対象フォルダ内のpdfファイル存在確認

6行目

URLを指定してChromeブラウザを起動

7行目

LinkText:"JKAニュース No34"を指定してリンクテキストを取得

8行目

取得したWeb要素をクリックして、PDFファイルをダウンロード

10~25行目

ダウンロードが完了するまで、待機実行。Compare-Objectを利用してダウンロードフォルダ内に、ダウンロード対象のPDFファイルが保存されるまで検索をし続ける。

27行目

2秒待機

28行目

Chromeブラウザを閉じる

Module

Start-SeChromeのSelenium-Module構文を以下に掲載します。

function Start-SeChrome {
    [cmdletbinding(DefaultParameterSetName = 'default')]
    [Alias('SeChrome')]
    param(
        [ValidateURIAttribute()]
        [Parameter(Position = 0)]
        [string]$StartURL,
        [Parameter(Mandatory = $false)]
        [array]$Arguments,
        [switch]$HideVersionHint,
        [System.IO.FileInfo]$DefaultDownloadPath,
        [System.IO.FileInfo]$ProfileDirectoryPath,
        [Parameter(DontShow)]
        [bool]$DisableBuiltInPDFViewer = $true,
        [switch]$EnablePDFViewer,
        [Alias('PrivateBrowsing')]
        [switch]$Incognito,
        [parameter(ParameterSetName = 'hl', Mandatory = $true)]
        [switch]$Headless,
        [parameter(ParameterSetName = 'Min', Mandatory = $true)]
        [switch]$Maximized,
        [parameter(ParameterSetName = 'Max', Mandatory = $true)]
        [switch]$Minimized,
        [parameter(ParameterSetName = 'Ful', Mandatory = $true)]
        [switch]$Fullscreen,
        [switch]$DisableAutomationExtension,
        [Alias('ChromeBinaryPath')]
        $BinaryPath,
        $WebDriverDirectory = $env:ChromeWebDriver,
        [switch]$Quiet,
        [switch]$AsDefaultDriver,
        [int]$ImplicitWait = 10
    )

    process {
        #region chrome set-up options
        $Chrome_Options = [OpenQA.Selenium.Chrome.ChromeOptions]::new()

        if ($DefaultDownloadPath) {
            Write-Verbose "Setting Default Download directory: $DefaultDownloadPath"
            $Chrome_Options.AddUserProfilePreference('download', @{'default_directory' = $($DefaultDownloadPath.FullName); 'prompt_for_download' = $false; })
        }

        if ($ProfileDirectoryPath) {
            Write-Verbose "Setting Profile directory: $ProfileDirectoryPath"
            $Chrome_Options.AddArgument("user-data-dir=$ProfileDirectoryPath")
        }

        if ($BinaryPath) {
            Write-Verbose "Setting Chrome Binary directory: $BinaryPath"
            $Chrome_Options.BinaryLocation = "$BinaryPath"
        }

        if ($DisableBuiltInPDFViewer -and -not $EnablePDFViewer) {
            $Chrome_Options.AddUserProfilePreference('plugins', @{'always_open_pdf_externally' = $true; })
        }

        if ($Headless) {
            $Chrome_Options.AddArguments('headless')
        }

        if ($Incognito) {
            $Chrome_Options.AddArguments('Incognito')
        }

        if ($Maximized) {
            $Chrome_Options.AddArguments('start-maximized')
        }

        if ($Fullscreen) {
            $Chrome_Options.AddArguments('start-fullscreen')
        }
		
        if ($DisableAutomationExtension) {
            $Chrome_Options.AddAdditionalCapability('useAutomationExtension', $false)
            $Chrome_Options.AddExcludedArgument('enable-automation')
        }

        if ($Arguments) {
            foreach ($Argument in $Arguments) {
                $Chrome_Options.AddArguments($Argument)
            }
        }

        if (!$HideVersionHint) {
            Write-Verbose "Download the right chromedriver from 'http://chromedriver.chromium.org/downloads'"
        }

        if ($WebDriverDirectory) { $service = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($WebDriverDirectory) }
        elseif ($AssembliesPath) { $service = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService($AssembliesPath) }
        else { $service = [OpenQA.Selenium.Chrome.ChromeDriverService]::CreateDefaultService() }
        if ($Quiet) { $service.HideCommandPromptWindow = $true }
        #endregion

        $Driver = [OpenQA.Selenium.Chrome.ChromeDriver]::new($service, $Chrome_Options)
        if (-not $Driver) { Write-Warning "Web driver was not created"; return }

        #region post creation options
        $Driver.Manage().Timeouts().ImplicitWait = [TimeSpan]::FromSeconds($ImplicitWait)

        if ($Minimized) {
            $Driver.Manage().Window.Minimize();
        }

        if ($Headless -and $DefaultDownloadPath) {
            $HeadlessDownloadParams = [system.collections.generic.dictionary[[System.String], [System.Object]]]::new()
            $HeadlessDownloadParams.Add('behavior', 'allow')
            $HeadlessDownloadParams.Add('downloadPath', $DefaultDownloadPath.FullName)
            $Driver.ExecuteChromeCommand('Page.setDownloadBehavior', $HeadlessDownloadParams)
        }

        if ($StartURL) { $Driver.Navigate().GoToUrl($StartURL) }
        #endregion

        if ($AsDefaultDriver) {
            if ($Global:SeDriver) { $Global:SeDriver.Dispose() }
            $Global:SeDriver = $Driver
        }
        else { $Driver }
    }
}
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAを中心とした自動化、効率化の手法を紹介しています。現在は、SeleniumBasicのexamplesを紹介しています。その内、SeleniumBasic以外の手法も掲載したいと思っております。

目次