Skip to content

Instantly share code, notes, and snippets.

@stuncloud
Last active January 8, 2024 05:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save stuncloud/b1e8135446b5f15709a9d98b2288e15e to your computer and use it in GitHub Desktop.
Save stuncloud/b1e8135446b5f15709a9d98b2288e15e to your computer and use it in GitHub Desktop.
UwscWebDriverのwiki

UwscWebDriverのwikiの元となったmarkdownファイル群です。リンク等は機能しない可能性があります。

0.6.0以降

詳細は0.4.2以前を見てください
[[WebDriverOptionオブジェクト]]をそのまま渡せるようになりました

call UwscWebDriver.uws

opt = WebDriver.Option("chrome")
opt.args.add("--user-data-dir=C:\\Users\\{your_name}\\AppData\\Local\\Google\\Chrome\\User Data") // {your_name}を適宜変更
opt.args.add("--profile-directory={profile_name}") // {profile_name}を適宜変更

driver = WebDriver.Chrome(9515, opt)

0.5.0以降

詳細は0.4.2以前を見てください

call UwscWebDriver.uws

opt = WebDriver.Option("chrome")
opt.args.add("--user-data-dir=C:\\Users\\{your_name}\\AppData\\Local\\Google\\Chrome\\User Data") // {your_name}を適宜変更
opt.args.add("--profile-directory={profile_name}") // {profile_name}を適宜変更

driver = WebDriver.Chrome(9515, opt.toString())

0.4.2以前

起動オプションに--user-data-dir--profile-directoryを入れます

call UwscWebDriver

// ユーザーデータがある場所
// おそらくデフォルトは%localappdata%\Google\Chrome\User Dataです
// {your_name}の部分、またはパスそのものを適宜変更してください
userDataPath = "C:\Users\{your_name}\AppData\Local\Google\Chrome\User Data"
// プロファイル名、おそらくデフォルトはdefaultです
// {your_profile}の部分を適宜変更してください
profileName = "{your_profile}"
// capabilitiesを作成
ChromeProfileCapabilities = GetChromeProfileCapabilities(userDataPath, profileName)

driver = WebDriver.Chrome(9515, ChromeProfileCapabilities)
// うまくいけば自分のプロファイルを読み込んで開かれているはず

msgbox(1)
driver.Close()

function GetChromeProfileCapabilities(path, name)
    result = replace(template, "%profile%", replace(path, "\", "\\"))
    result = replace(result, "%name%", name)
fend

textblock template
{
    "capabilities": {
        "alwaysMatch": {
            "browserName": "chrome",
            "goog:chromeOptions": {
                "args": [
                    "--user-data-dir=%profile%",
                    "--profile-directory=%name%"
                ]
             }
        }
    }
}
endtextblock

プロファイル名についてはユーザーデータのディレクトリを見ると

Default
Default.optimization_guide_model_and_features_store
Default.previews_hint_cache_store
Guest Profile
Guest Profile.optimization_guide_model_and_features_store
Guest Profile.previews_hint_cache_store

みたいな感じのディレクトリができてて、この場合DefaultだったりGuest Profileだったりがそれです

inputtextarea に対して Clear() を実行しても入力値がクリアされない場合があるようです

element.Clear() // 消えない場合がある

対処法

JavaScriptを使う

// エレメントのvalueプロパティに空文字を代入する
element.ExecuteScript("$0.value = '';")

一旦クリックしてからクリアする

ExecuteScriptでもクリアできなかった場合に以下を行ったところうまく行ったという報告がありました

// エレメントをクリック
element.Click()
// エレメントのvalueプロパティに空文字を代入する
element.ExecuteScript("$0.value = '';")

ブラウザ操作に関するオブジェクトです
[WebDriver.Start|WebDriverモジュール#WebDriver.Start]等の関数が返します

メソッド

メソッドの書式には以下が利用可能です

  • PascalCase
  • lowercase
  • UPPERCASE
  • camelCase
  • snake_case (単語区切りがある場合のみ、小文字限定)
// 以下はOK
driver.FindElement() // PascalCase
driver.findelement() // lowercase
driver.FINDELEMENT() // UPPERCASE
driver.findElement() // camelCase
driver.find_element() // snake_case

// 以下はNG
// 単語区切りではない場所の大文字
driver.FindELEMENT()
// 単語区切りの頭が小文字
driver.Findelement()
// snakecaseで大文字を含む
driver.Find_Element()

GetSession

戻り値 = driver.GetSession()

現在のwebdriverセッション情報を取得します

  • 戻り値
    セッション情報 (文字列)

GetBrowserName

戻り値 = driver.GetBrowserName()

操作対象ブラウザの名前を取得します

  • 戻り値
    ブラウザ名 (文字列)

GetBrowserVersion

戻り値 = driver.GetBrowserVersion()

操作対象ブラウザのバージョンを取得します

  • 戻り値
    ブラウザバージョン (文字列)

Navigate

戻り値 = driver.Navigate(url [, target])
  • url
    指定したURLを開きます
  • target
    省略可
    値を指定した場合は別タブで開かれます
  • 戻り値
    なし
// 任意のURLを開く
driver.Navigate(url)
// 任意のURLを別タブで開く
driver.Navigate(url, "_blank")

Reload

driver.Reload()

開いているページをリロードします

  • 戻り値
    なし

SwitchWindow

戻り値 = driver.SwitchWindow(handleOrName)

別のウィンドウ(タブ)に制御を移します

  • handleOrName
    ウィンドウハンドル、またはウィンドウ名
    ウィンドウ名は window.name です
    targetで別名指定されていた場合などに使います
    ただしハンドルを指定するより遅いです
  • 戻り値
    制御を移したウィンドウのハンドル
// 元のタブのウィンドウハンドルを得る
hFirst = driver.GetCurrentWindowHandle()
// 別タブを開く
driver.Navigate(url, "SecondTab")
// 別タブに制御を移す
hSecond = driver.SwitchWindow("SecondTab")
// 元のウィンドウに戻る
driver.SwitchWindow(hFirst)

SwitchFrame

※ 動作保証対象外です

戻り値 = driver.SwitchFrame(id)

操作対象のフレームを切り替えます

  • id
    フレームを示すid (0から)
    -1 を指定した場合親フレームに切り替わる
  • 戻り値
    フレーム切り替えに成功したらTrue

GetCurrentWindowHandle

戻り値 = driver.GetCurrentWindowHandle()

現在の制御対象ウィンドウのハンドルを得ます

  • 戻り値
    ウィンドウハンドル

GetWindowHandles

戻り値 = driver.GetWindowHandles()

制御可能なウィンドウのハンドルを列挙します

  • 戻り値
    ウィンドウハンドルの配列(SafeArray)
for h in driver.GetWindowHandles()
    driver.SwitchWindow(h)

    // それぞれのウィンドウに対する処理を実行
    DoSomoThing(driver)
next

GetUrl

戻り値 = driver.GetUrl()

現在開いているページのURLを取得します

  • 戻り値
    URL

GetTitle

戻り値 = driver.GetTitle()

現在開いているページのタイトルを取得します

  • 戻り値
    タイトル

GetSource

戻り値 = driver.GetSource()

現在開いているページのHTMLソースを取得します

  • 戻り値
    HTMLソース

FindElement

戻り値 = driver.FindElement(selector)

cssセレクタを指定して該当するエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのcssセレクタ
    [[Byモジュール]]が利用可能
  • 戻り値
    • 成功時
      [[elementオブジェクト]]
    • 失敗時
      null

FindElements

戻り値 = driver.FindElements(selector)

cssセレクタを指定して該当する複数のエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのcssセレクタ
    [[Byモジュール]]が利用可能
  • 戻り値
    • 成功時
      [[elementオブジェクト]]配列 (SafeArray)
    • 失敗時
      null

FindElementsByName

戻り値 = driver.FindElementsByName(name)

name属性の値を指定して該当する複数のエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのname属性
  • 戻り値
    • 成功時
      [[elementオブジェクト]]配列 (SafeArray)
    • 失敗時
      null

FindElementByXPath

戻り値 = driver.FindElementByXPath(xpath)

xpathを指定して該当するエレメントの[[elementオブジェクト]]を取得します

  • xpath
    対象エレメントのxpath
  • 戻り値
    • 成功時
      [[elementオブジェクト]]
    • 失敗時
      null

FindElementsByXPath

戻り値 = driver.FindElementsByXPath(xpath)

xpathを指定して該当する複数のエレメントの[[elementオブジェクト]]を取得します

  • xpath
    対象エレメントのxpath
  • 戻り値
    • 成功時
      [[elementオブジェクト]]配列 (SafeArray)
    • 失敗時
      null

ExecuteScript

戻り値 = driver.ExecuteScript(script [, arg1, arg2, ...])

任意のJavaScriptを実行させます

  • script
    JavaScriptのスクリプト構文
  • arg1, arg2, ...
    実行するJavaScriptに渡す引数を指定 (可変長、省略可)
    script 内で arguments[] としてこの値にアクセスできます
    args1arguments[0]args2arguments[1] のように順に対応しています
    [[elementオブジェクト]]を渡す場合は[[raw()|elementオブジェクト#raw]]メソッドを呼びます
  • 戻り値
    • script 内で return した以下に該当する値 (それ以外はnull)
      • 文字列、数値
      • エレメント ([[elementオブジェクト]]として返ります) ※0.8.4から

0.11.0以降では以下のように書けます

elem = driver.FindElement(selector)

textblock js
arguments[0].style.backgroungColor = arguments[1];
return arguments[0].outerHTML;
endtextblock

outerhtml = driver.ExecuteScript(js, elem.raw(), "red")
print driver.ExecuteScript("return [...arguments].reduce((a,b) => a + b);", 1, 3, 5, 7) // 16

0.7.2以降では以下のように書けます

elem = driver.FindElement(selector)

textblock js
arguments[0].style.backgroungColor = arguments[1];
return arguments[0].outerHTML;
endtextblock

outerhtml = driver.ExecuteScript(js, JS.Args(elem.raw(), "red"))

0.7.1以前

elem = driver.FindElement(selector)

textblock js
arguments[0].style.backgroungColor = arguments[1];
return arguments[0].outerHTML;
endtextblock

// js配列を作る
args = WebDriver.CreateJSArray()
// js要素を足す
// elementオブジェクトも渡せる、その場合raw()メソッドを使う
args.push(elem.raw())
// 文字列とかでも当然OK
args.push("red")

outerhtml = driver.ExecuteScript(js, args)

GetDialogText

戻り値 = driver.GetDialogText()

window.alert(), window.confirm(), window.prompt() で表示されたダイアログのテキストを取得します

  • 戻り値
    ダイアログに表示されたテキスト

SetDialogText

戻り値 = driver.SetDialogText(value)

window.prompt() で表示されたプロンプトに値を入力します
window.alert(), window.confirm() に対しては無効です

  • value
    ダイアログに入力する値
  • 戻り値
    なし

AcceptDialog

戻り値 = driver.AcceptDialog()

window.alert(), window.confirm(), window.prompt() のOKボタンを押します

  • 戻り値
    なし

DismissDialog

戻り値 = driver.DismissDialog()

window.alert(), window.confirm(), window.prompt() のキャンセルボタンを押します
(window.alert() にキャンセルボタンはありませんが閉じられます)

  • 戻り値
    なし

GetRect

戻り値 = driver.GetRect()

ブラウザのサイズと座標を取得します

  • 戻り値
    Rectオブジェクト
    以下のフィールドを持ちます
    • width (幅)
    • height (高さ)
    • x (x座標)
    • y (y座標)
rect = driver.GetRect()
if (rect <> null) then
    with rect
        print "幅: " + .width
        print "高さ: " + .height
        print "x座標: " + .x
        print "y座標: " + .y
    endwith
endif

SetRect

戻り値 = driver.SetRect(width, height, x, y)

ブラウザのサイズと座標を変更します

  • width
    ブラウザの幅
    変更しない場合はnullにする
  • height
    ブラウザの高さ
    変更しない場合はnullにする
  • x
    ブラウザのx座標
    変更しない場合はnullにする
  • y
    ブラウザのy座標
    変更しない場合はnullにする
  • 戻り値
    Rectオブジェクト

Maximize

戻り値 = driver.Maximize()

ブラウザを最大化します

  • 戻り値
    Rectオブジェクト

Minimize

戻り値 = driver.Minimize()

ブラウザを最小化します

  • 戻り値
    Rectオブジェクト

Fullscreen

戻り値 = driver.Fullscreen()

ブラウザをフルスクリーン表示します
※ フルスクリーンに対応しているブラウザのみ

  • 戻り値
    Rectオブジェクト

Close

driver.Close()

セッションを終了しブラウザを閉じます
WebDriverは起動したままなので、WebDriverを終了させたい場合は手動でコマンドプロンプトを閉じてください

  • 戻り値
    なし

SetImplicitWait

FindElement等の最大待ち時間を設定します
初期値は 10000 (10秒)です

driver.SetImplicitWait(待機時間)
  • 待機時間
    • 待機時間をミリ秒で指定
  • 戻り値
    • なし
// セレクタに該当するエレメントがない場合10秒待機します
elem = driver.FindElement(invalid_selector) // 不正なセレクタ

// 待機時間を500ミリ秒 (0.5秒) に変更
driver.SetImplicitWait(500)

// 待機時間が0.5秒に短縮される
elem = driver.FindElement(invalid_selector) // 不正なセレクタ

エレメント操作に関するオブジェクトです
[[driverオブジェクト]]の[FindElement|driverオブジェクト#FindElement]等が返します

メソッド

メソッドの書式には以下が利用可能です

  • PascalCase
  • lowercase
  • UPPERCASE
  • camelCase (単語区切りがある場合のみ)
  • snake_case (単語区切りがある場合のみ、小文字限定)
// 以下はOK
element.FindElement() // PascalCase
element.findelement() // lowercase
element.FINDELEMENT() // UPPERCASE
element.findElement() // camelCase
element.find_element() // snake_case

// 以下はNG
// 単語区切りではない場所の大文字
element.FindELEMENT()
// 単語区切りの頭が小文字
element.Findelement()
// snakecaseで大文字を含む
element.Find_Element()

FindElement

戻り値 = element.FindElement(selector)

対象エレメントを起点としたcssセレクタを指定して該当するエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのcssセレクタ
    [[Byモジュール]]が利用可能
  • 戻り値
    • 成功時
      [[elementオブジェクト]]
    • 失敗時
      null

FindElements

戻り値 = element.FindElements(selector)

対象エレメントを起点としたcssセレクタを指定して該当する複数のエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのcssセレクタ
    [[Byモジュール]]が利用可能
  • 戻り値
    • 成功時
      [[elementオブジェクト]]配列 (SafeArray)
    • 失敗時
      null

FindElementByXPath

戻り値 = element.FindElementByXPath(xpath)

対象エレメントを起点としたxpathを指定して該当するエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのxpath
  • 戻り値
    • 成功時
      [[elementオブジェクト]]
    • 失敗時
      null

FindElementsByXPath

戻り値 = element.FindElementsByXPath(xpath)

対象エレメントを起点としたxpathを指定して該当する複数のエレメントの[[elementオブジェクト]]を取得します

  • selector
    対象エレメントのxpath
  • 戻り値
    • 成功時
      [[elementオブジェクト]]配列 (SafeArray)
    • 失敗時
      null

Click

戻り値 = element.Click()

エレメントをクリックします

  • 戻り値
    なし

Clear

input[type="text"]等の値を消去します

element.Clear()

SetValue

戻り値 = element.SetValue(value)

input[type="text"]等の文字入力欄に値を入力します
もともと値が入力されている場合は追記されます
新しく値を入力する場合は事前にClear()を呼んでください

input[type="file"]に対してファイルパスを指定できます
実在するファイルのパスを指定する必要があります

  • value
    入力する値
  • 戻り値
    なし

GetValue

戻り値 = element.GetValue()

inputやselect等のvalueの値を取得します

  • 戻り値
    取得した値

GetText

戻り値 = element.GetText()

エレメント配下のテキストノードの値を取得します

  • 戻り値
    取得した値

GetAttribute

戻り値 = element.GetAttribute(attribute)

エレメントの属性の値を取得します

  • attribute
    属性の名前
  • 戻り値
    取得した値

GetProperty

戻り値 = element.GetProperty(property)

エレメントのプロパティを取得します

  • property
    プロパティ名
  • 戻り値
    取得した値

IsSelected

戻り値 = element.IsSelected()

ラジオボタン等が選択されているかどうかを取得します

  • 戻り値
    bool値

ExecuteScript

戻り値 = element.ExecuteScript(script [, args1, arg2, ...])

任意のJavaScriptを実行させます

  • script
    JavaScriptのスクリプト構文
  • args1, arg2, ...
    実行するJavaScriptに渡す引数を指定 (可変長、省略可)
    script 内で arguments[] としてこの値にアクセスできます
    args1arguments[0]args2arguments[1] のように順に対応しています
    自身を呼び出す場合は$0と記述します
  • 戻り値
    • script 内で return した以下に該当する値 (それ以外はnull)
      • 文字列、数値
      • エレメント ([[elementオブジェクト]]として返ります) ※0.8.4から
dim elem = driver.FindElement(selector)
dim parent = elem.ExecuteScript("return $0.parentElement;") // 自分自身は$0
print parent.GetProperty("id") // 親要素のidを取得

引数の渡し方

dim element = driver.FindElement(selector)
// 引数はargumentsで得られる
element.ExecuteScript("$0.value = arguments[0];", "にゃーん")
print element.ExecuteScript("return $0.value;") // にゃーん

raw

戻り値 = element.raw()

WebDriverが返す元々のJavaScriptオブジェクトを得る

  • 戻り値
    jsオブジェクト

0.6.0以降

[[WebDriverOptionオブジェクト]]をそのまま渡せるようになりました

call UwscWebDriver.uws

opt = WebDriver.Option("chrome")
opt.args.add("headless") // 起動オプション(args)にheadlessを追加

// ヘッドレスモードで起動
headless = WebDriver.Chrome(9515, opt)

0.5.0以降

call UwscWebDriver.uws

opt = WebDriver.Option("chrome")
opt.args.add("headless") // 起動オプション(args)にheadlessを追加

// ヘッドレスモードで起動
headless = WebDriver.Chrome(9515, opt.toString())

0.4.2以前

call UwscWebDriver.uws

textblock capabilities_headless
{
   "capabilities": {
      "firstMatch": [ {
         "browserName": "chrome",
         "goog:chromeOptions": {
            "args": [ "headless", "disable-gpu" ]
         }
      } ]
   },
   "desiredCapabilities": {
      "browserName": "chrome",
      "goog:chromeOptions": {
         "args": [ "headless", "disable-gpu" ]
      }
   }
}
endtextblock

driver = WebDriver.Start(Webdriver.Chrome, 9515, capabilities_headless)

関数

JS.Args

[[ExecuteScript|driverオブジェクト#ExecuteScript]] の第2引数を生成します

戻り値 = JS.Args(arg, [arg, arg, ...])
  • arg (最大10/1つ目は必須)
    JavaScriptに渡す引数
  • 戻り値
    JavaScript配列
elem = driver.FindElement(selector)
outerHtml = driver.ExecuteScript("return arguments[0].outerHTML;", JS.Args(elem.raw()))

0.6.0以降

[[WebDriverOptionオブジェクト]]をそのまま渡せるようになりました

call UwscWebDriver.uws

opt = WebDriver.Option("edge")
opt.args.add("headless") // 起動オプション(args)にheadlessを追加

// ヘッドレスモードで起動
headless = WebDriver.Edge(9515, opt)

0.5.0以降

call UwscWebDriver.uws

opt = WebDriver.Option("edge")
opt.args.add("headless") // 起動オプション(args)にheadlessを追加

// ヘッドレスモードで起動
headless = WebDriver.Edge(9515, opt.toString())

0.4.2以前

起動オプションにheadlessを渡します

call UwscWebDriver

driver = WebDriver.Edge(9515, MsEdgeHeadlesCapabilities)
// 見えてはいないけど存在はしている
msgbox(driver.GetBrowserName())

driver.Close()

textblock MsEdgeHeadlesCapabilities
{
    "capabilities": {
        "alwaysMatch": {
            "browserName": "msedge",
            "ms:edgeOptions": {
                "args": [
                    "headless"
                ]
            }
        }
    }
}
endtextblock

driver.FindElementに渡すcssセレクタを生成します

SelectorBuilderモジュール

New

builder = SelectorBuilder.New()
変数名 種別 説明
builder SelectorBuilderオブジェクト 戻り値 SelectorBuilderオブジェクトの新しいインスタンスを返します

SelectorBuilderオブジェクト

  • SelectorBuilderオブジェクトの各メソッド名は大文字小文字を問いません
  • オブジェクト自身を返すメソッドはメソッドチェーンが可能です

Tag

タグ名を指定する

builder = builder.Tag(タグ名)
変数名 種別 説明
タグ名 文字列 必須 タグ名を指定します (例: div, input)
builder SelectorBuilder 戻り値 SelectorBuilderオブジェクト自身を返します

Id

idを指定する

builder = builder.Id(id)
変数名 種別 説明
id 文字列 必須 id属性を指定します
builder SelectorBuilder 戻り値 SelectorBuilderオブジェクト自身を返します

ClassName

クラス名を指定する

builder = builder.ClassName(クラス名)
変数名 種別 説明
クラス名 文字列 必須 クラス名を指定します
builder SelectorBuilder 戻り値 SelectorBuilderオブジェクト自身を返します

Attribute

属性とその値を指定する

builder = builder.Attribute(属性, 値)
変数名 種別 説明
属性 文字列 必須 属性名を指定します
文字列 必須 属性値を指定します
builder SelectorBuilder 戻り値 SelectorBuilderオブジェクト自身を返します

Descendant

子孫セレクタを返す ( で結合される)

builder = builder.Descendant()
変数名 種別 説明
builder SelectorBuilder 戻り値 子孫セレクタとなる新たなSelectorBuilderオブジェクト

Child

NextSibling

子セレクタを返す (>で結合される)

builder = builder.Child()
変数名 種別 説明
builder SelectorBuilder 戻り値 子セレクタとなる新たなSelectorBuilderオブジェクト

NextSibling

隣接セレクタを返す (+で結合される)

builder = builder.NextSibling()
変数名 種別 説明
builder SelectorBuilder 戻り値 隣接セレクタとなる新たなSelectorBuilderオブジェクト

Build

ToString

CSSセレクタを生成します

セレクタ = builder.Build()
セレクタ = builder.ToString()
変数名 種別 説明
セレクタ 文字列 戻り値 生成されたCSSセレクタ

使い方

builder = SelectorBuilder.new() // SelectorBuilderオブジェクトのインスタンスを新規作成
// SelectorBuilderの各メソッドは自身を返すため、基本はメソッドチェーンで実行する
selector = builder.tag("input")_
                  .attribute("type", "text")_
                  .attribute("name", "q")_
                  .classname("gLFyf")_
                  .classname("gsfi")_
                  .build() // セレクタ文字列を生成

print selector // input.gLFyf.gsfi[type="text"][name="q"]

// FindElementに渡す場合SelectorBuilderオブジェクトのままでもOK
builder = SelectorBuilder.new() 
selector = builder.id("foo").classname("bar").classname("baz")

elem = driver.FindElement(selector) // OK
elem = driver.FindElement(selector.build()) // 文字列にしても良い

// 結合セレクタ例
// <div id="parent">
//     <span name="child1">
//     <span name="child2">
// </div>
builder = SelectorBuilder.new() 
parent = builder.tag("div").id("parent")
print parent.build() // div#parent
print parent.child().tag("span").build() // div#parent > span
print parent.child().tag("span").nextSibling().tag("span").build() // div#parent > span + span

WebDriverDownload.MsEdge

戻り値 = WebDriverDownload.MsEdge([major, dir])
戻り値 = WebDriverDownload.ChromiumEdge([major, dir])

新MS Edge(Chromium Edge)用のWebdriverをダウンロードします

  • major (省略可)
    ダウンロードするmsedgedriverのメジャーバージョン
    例: 91.0.864.48 であれば 91
    省略時はその時点での最新版(Stable Channel)をダウンロードします
  • dir (省略可)
    保存先フォルダを指定する
    デフォルトはカレントディレクトリまたはSetDownloadDir()で指定したフォルダ
  • 戻り値
    • 成功時
      msedgedriverのバージョン
    • 失敗時
      EMPTY

WebDriverDownload.Chrome

戻り値 = WebDriverDownload.Chrome([major, dir])

chromedriverをダウンロードします

  • major (省略可)
    ダウンロードするchromedriverのメジャーバージョン
    例: 91.0.4472.101 であれば 91
    省略時はその時点での最新版をダウンロードします
  • dir (省略可)
    保存先フォルダを指定する
    デフォルトはカレントディレクトリまたはSetDownloadDir()で指定したフォルダ
  • 戻り値
    • 成功時
      chromedriverのバージョン
    • 失敗時
      EMPTY

WebDriverDownload.Firefox

戻り値 = WebDriverDownload.Firefox(bit[, dir])

geckodriverをダウンロードします

  • bit
    32または64を指定
    操作するFirefoxに合わせる
  • dir (省略可)
    保存先フォルダを指定する デフォルトはカレントディレクトリまたはSetDownloadDir()で指定したフォルダ
  • 戻り値
    • 成功時
      geckodriverのバージョン
    • 失敗時
      EMPTY

WebDriverDownload.Dialog

戻り値 = WebDriverDownload.Dialog([dir])

GUIを操作しwebdriverのダウンロードを行います

  • dir (省略可)
    保存先フォルダを指定する
    デフォルトはカレントディレクトリまたはSetDownloadDir()で指定したフォルダ
  • 戻り値
    • 成功時
      有効化またはダウンロードしたwebdriverのバージョン
    • 失敗時
      EMPTY

WebDriverDownload.SetDownloadDir

WebDriverDownload.SetDownloadDir(dir [, gui])
  • dir
    デフォルトのダウンロードフォルダを指定
  • gui (省略可)
    TRUEにするとGUIから選択

[[WebDriver.Option()|WebDriverモジュール#WebDriver.Option]]が返すオブジェクト
WebDriver.Chrome()などのoption引数に使えます

オブジェクトメンバの書式について

以下に対応しています

  • UPPERCASE
  • lowercase
  • PascalCase
opt = WebDriver.Option("chrome")

// 以下のような書式はOK
opt.args.Add("foo") // lowercase PascalCase
opt.ARGS.add("bar") // UPPERCASE lowercase
opt.Args.REMOVE("foo") // PascalCase UPPERCASE

// 以下はNG
opt.ArGs.adD("baz") // 単語の節目ではないPascalCaseやcamelCase

args

ブラウザの起動オプションを指定するためのオブジェクト
以下のメソッドを持ちます

add

戻り値 = option.args.add(起動オプション)
  • 起動オプション
    ブラウザのexe実行時に付与する起動オプション文字列
    詳細についてはそれぞれのブラウザのドキュメントを参照してください
  • 戻り値
    • argsに登録された起動オプションの数

remove

戻り値 = option.args.remove(起動オプション)
  • 起動オプション
    登録済みの起動オプションから一致するものを削除する
  • 戻り値
    • argsに登録された起動オプションの数

setOption

args以外のオプションを追加または変更できます

opt.setOption(オプション名, 値)
  • オプション名
    追加するオプション名

  • オプションにセットする値

eval

json文字列をjsオブジェクトに変換します
setOptionでオブジェクトを渡す必要がある場合に使用します

opt.eval(json文字列)
  • json文字列
    オブジェクトに変換したいjsonを示す文字列

使用例

opt = WebDriver.Option("chrome") // chrome, edge, firefox のいずれかを指定
opt.args.add("headless") // 起動オプション(args)にheadlessを追加

// ヘッドレスモードで起動
headless = WebDriver.Chrome(9515, opt)
opt = WebDriver.Option("msedge")
// msegdeのパスを指定する
opt.setOption("binary", "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe")

driver = WebDriver.Edge(9515, opt)

WebDriver.Version

戻り値 = WebDriver.Version()

モジュールのバージョンを得ます

  • 戻り値
    モジュールのバージョン

WebDriver.HideCmd

WebDriver.HideCmd()

WebDriver.Start() 実行時にコマンドプロンプトの画面表示されなくなります
(WebDriver.Start() の前に呼ぶ必要があります)
スクリプト終了後もコマンドプロンプトは非表示のまま残ります
不要な場合はタスクマネージャ等で終了させてください

WebDriver.Option

戻り値 = WebDriver.Option(browser)
  • browser
    • ブラウザ種別を示す文字列
      • "chrome"
      • "edge" "msedge"
      • "firefox"
  • 戻り値
    • [[WebDriverOptionオブジェクト]]

WebDriver.Start

戻り値 = WebDriver.Start(driverpath[, port[, option]])

WebDriverとブラウザを起動してwebdriverオブジェクトを取得します
取得に失敗した場合はスクリプトを強制終了します 事前に WebDriver.HideCmd() を実行していない場合、コマンドプロンプトの画面が表示されます

  • driverpath
    Chromeなら WebDriver.Chrome
    新MS Edgeなら WebDriver.Edge または WebDriver.ChromiumEdge
    旧MS Edgeなら WebDriver.EdgeLegacy
    Firefoxなら WebDriver.Firefox
    を指定します
    それ以外のWebDriverの場合はexeのフルパスを指定してください
  • port
    省略可能
    WebDriverの待受ポート番号を指定します
    デフォルトは 9515 です
  • option (省略可)
    webdriverに渡すオプションの内容を記述したjson文字列
    またはWebDriverOptionオブジェクト
  • 戻り値
    • 成功時
      [[driverオブジェクト]]
    • 失敗時
      null (警告を無視した場合)

WebDriver.SuppressNullError

driverオブジェクトが取得できなかった場合の警告を抑制するかどうか

  • FALSE: driverオブジェクトが取得できない場合に警告を表示します (デフォルト)
  • TRUE: driverオブジェクトが取得できない場合に警告をしません
WebDriver.SuppressNullError = FALSE // 警告を出す
WebDriver.SuppressNullError = TRUE  // 警告を出さない

WebDriver.Chrome

WebDriver.Edge

WebDriver.Firefox

戻り値 = WebDriver.Chrome([port[, option]])
戻り値 = WebDriver.Edge([port[, option]])
戻り値 = WebDriver.Firefox([port[, option]])

WebDriver.Start() のブラウザ別ラッパー関数です
WebDriverとブラウザを起動し、webdriverオブジェクトを取得します
取得に失敗した場合はスクリプトを強制終了します 事前に WebDriver.HideCmd() を実行していない場合、コマンドプロンプトの画面が表示されます
WebDriverは実行スクリプトと同じディレクトリ、または %PATH% に配置する必要があります

  • port
    省略可能
    WebDriverの待受ポート番号を指定します
    デフォルトは 9515 です
  • option (省略可)
    webdriverに渡すオプションの内容を記述したjson文字列
    またはWebDriverOptionオブジェクト
  • 戻り値
    • 成功時
      [[driverオブジェクト]]
    • 失敗時
      null (警告を無視した場合)

WebDriver.Remote

戻り値 = WebDriver.Remote(remotehost, port, capabilities)

selenium-server-standalone.jarを実行しているPC上のWebDriverに接続します

  • remotehost
    リモートPCのホスト名またはIPアドレス
    ローカルでselenium-server-standalone.jarを実行している場合はlocalhost
  • port
    Selenium standalone serverの待ち受けポートです
    デフォルトは4444のようです
  • capabilities
    capabilitiesのjson文字列
    以下の定数が定義されています
    Edge: WebDriver.RemoteEdgeCapabilities
    Chrome: WebDriver.RemoteChromeCapabilities
  • 戻り値
    • 成功時
      [[driverオブジェクト]]
    • 失敗時
      null
remotedriver = WebDriver.Remote("192.168.x.x", "4444", WebDriver.RemoteChromeCapabilities)

WebDriver.Connect

戻り値 = WebDriver.Connect(session)

以前のwebdriverセッションを再利用し、起動済みのブラウザを再び操作できるようにします

  • session
    webdriver.GetSession() で取得したセッション情報
  • 戻り値
    • 成功時
      [[driverオブジェクト]]
    • 失敗時
      null

WebDriver.CreateJSArray

戻り値 = WebDriver.CreateJSArray()

JavaScriptの配列を得ます
push() で要素を追加できます

  • 戻り値
    空のJavaScript配列
arr = WebDriver.CreateJSArray()
arr.push("hoge")
arr.push("fuga")
arr.push("piyo")

WebDriver.GetError

戻り値 = WebDriver.GetError()

webdriverオブジェクトwebelementオブジェクト 起因のCOMエラーが発生した際のエラー詳細を得ます

  • 戻り値
    エラー詳細(文字列)

WebDriver.GetBrowserVersion

戻り値 = WebDriver.GetBrowserVersion(ブラウザ定数)

ブラウザのバージョンを取得する

  • ブラウザ定数
    • 以下の定数のいずれかを指定
      • WebDriver.Chrome
      • WebDriver.Firefox
      • WebDriver.Edge
    • またはexe名(文字列)
  • 戻り値
    • 成功時
      ブラウザバージョン (文字列)
    • 失敗時
      EMPTY

WebDriver.GetBrowserID

戻り値 = WebDriver.GetBrowserVersion(driver)
  • driver
    • driverオブジェクト
  • 戻り値
    • ブラウザのウィンドウID (失敗時-1)

WebDriver.SetHttpRequestProgID

WebDriver.SetHttpRequestProgID(progid)

HTTPリクエストを行うCOMコンポーネントを変更する
デフォルトは WinHttp.WinHttpRequest.5.1
不正なProgIDを指定した場合は実行時にエラーになります

  • progid
    • HTTPリクエストを行うCOMコンポーネントのProgID
        • Microsoft.XMLHTTP
        • Microsoft.XMLHTTP.1.0
        • Msxml2.ServerXMLHTTP
        • Msxml2.ServerXMLHTTP.3.0
        • Msxml2.ServerXMLHTTP.6.0
        • Msxml2.XMLHTTP
        • Msxml2.XMLHTTP.3.0
        • Msxml2.XMLHTTP.6.0
        • WinHttp.WinHttpRequest.5.1
// 0.8.7以前で使われていたMsxml2.XMLHTTPに戻す
WebDriver.SetHttpRequestProgID("Msxml2.XMLHTTP")
// Msxml2.XMLHTTP 6.0にする
WebDriver.SetHttpRequestProgID("Msxml2.XMLHTTP.6.0")

WebDriver.SetScriptControlTimeout

ScriptControlのタイムアウト時間を設定する

戻り値 = WebDriver.SetScriptControlTimeout(タイムアウト秒)
  • タイムアウト秒
    • タイムアウトするまでの秒数 (1以上)
    • -1を指定するとタイムアウトしない
  • 戻り値
    • 変更前のタイムアウト時間 (秒)

input[type="file"] に対して直接ファイルパスを指定できます
クリックしてファイル選択ダイアログを操作する必要はありません

file = driver.FindElement("input[type=<#DBL>file<#DBL>]")
// SetValue()でファイルパスを入力できます
// 存在しないファイルのパスを指定した場合はなにも入力されません
file.SetValue("C:\file_to_upload.txt")

0.2.0から

UwscWebDriverを実行する環境とは異なるPC上のブラウザを操作する方法です
対象となるPCはWindows以外(例:mac,Linux)でも大丈夫です

準備

操作対象のリモートPC

リモートPCにて以下をインストールします

  • JRE
    Java実行環境(30億台のデバイスで動いているやつ)です
  • Selenium StandAlone Server
    ここSelenium Standalone Serverからダウンロードしてjarファイルを任意のディレクトリに配置してください
  • WebDriver
    任意のWebDriverをPATHの通ったディレクトリに配置してください
  • ブラウザ
    操作対象のブラウザ

導入例: WindowsでChromeを使う場合 「管理者として実行」したPowerShellで以下を実行

Install-Package -ProviderName Chocolatier -Name javaruntime,selenium,googlechrome,chromedriver -Force
# Selenium StandAlone ServerはC:\tools\seleniumに配置される

※ Chocolatierが導入されていない場合は事前に以下を実行してください

Install-PackageProvider Chocolatier -Force
Import-Module Chocolatier

対象PCにてSelenium StandAlone Serverを実行します

java -jar C:\tools\selenium\selenium-server-standalone.jar

スクリプトの記述方法

driverオブジェクトは以下で取得できます
その後は同様に操作できます

remotedriver = WebDriver.Remote("192.168.x.x", "4444", WebDriver.RemoteChromeCapabilities)

ただしEdgeではExecuteScriptと別タブ関連のメソッドが機能しませんでした (Windows 10 1809)

0.3.0 から

以前起動したブラウザをスクリプト再実行時に操作できるようにします
以下の条件を満たす場合に使用できます

  • 前回のスクリプト実行でWebDriver.Start()でブラウザを起動している
  • 前回のスクリプト実行でdriver.Close()していない
  • driver.Close()以外でブラウザを終了していない (例: 手動で閉じる
  • webdriverを終了していない

あえて開きっぱなしにしておいたブラウザを再度操作できるようにする仕組みです
スクリプトの手直しをしつつ開いたブラウザを使いまわしたい場合などに便利

手順

  1. セッション情報を保存
  2. セッション情報を元にwebdriverオブジェクトを得る

セッション情報の取得

session = driver.GetSession()

セッション情報からwebdriverオブジェクトを取得

driver = WebDriver.Connect(session)

サンプル

call UwscWebDriver.uws

driverpath = WebDriver.Chrome

// 保存したセッション情報を読み取る
session = readini("WebDriver", "session")

if length(session) = 0 then
   // session情報が保存されていない場合はブラウザを起動する
   driver = WebDriver.Start(driverpath)
   driver.Navigate("http://example.com/")
   Alert(driver, "初回起動です")
   if msgbox("session情報を保存しますか?", BTN_YES or BTN_CANCEL) = BTN_YES then
      writeini("WebDriver", "session", driver.GetSession())
   endif
else
   // session情報が保存されている場合は再接続を試みる
   driver = WebDriver.Connect(session)
   if driver = NULL then
      msgbox("以前のセッションがCloseされた、ブラウザが閉じられた、<#CR>またはWebDriverが起動していないため再接続できません")
   else
      Alert(driver, "再接続しました")
   endif

   if driver <> null then
      if msgbox("ブラウザを閉じてsession情報を破棄しますか?", BTN_YES or BTN_CANCEL) = BTN_YES then
         driver.Close()
         deleteini("WebDriver", "session")
      endif
   endif
endif

procedure Alert(driver, text)
   args = WebDriver.CreateJSArray()
   args.push(text)
   driver.ExecuteScript("alert(arguments[0]);", args)
fend

C:\UwscWebDriver\download\ にダウンロードしたい場合

call UwscWebDriver.uws

// capabilitiesでダウンロードフォルダを指定します
textblock capa
{
    "capabilities": {
        "alwaysMatch": {
            "browserName": "msedge",
            "ms:edgeOptions": {
                "args": [],
                "prefs": {
                    "download": {
                        "default_directory": "C:\\UwscWebDriver\\download\\",
                        "prompt_for_download": false
                      }
                }
            }
        }
    }
}
endtextblock
// jsonなので \ は \\ のようにエスケープする必要があります

// capabilitiesを渡して起動
driver = WebDriver.Edge(9515, capa)
// 対象エレメントをクリックしたらダウンロードが始まる場合はそのようにする
download = driver.FindElement(selector_to_element)
download.click()

// ダウンロード完了を待つ
sleep(5)
// ファイルダウンロード完了を検出する仕組みがないので適当にsleepさせてください

ダウンロードファイルのURLが予め分かっている場合はnavigate()でもダウンロードできます

driver = WebDriver.Edge(9515, capa)
driver.navigate(file_url)
sleep(5)

自動テストソフトウェアによって制御されています のinfobarを消す方法

Chrome

textblock remove_infobar
{
    "capabilities": {
        "alwaysMatch": {
            "browserName": "chrome",
            "goog:chromeOptions": {
                "args": [],
                "excludeSwitches": [
                    "enable-automation"
                ]
            }
        }
    }
}
endtextblock

driver = WebDriver.Chrome(9515, remove_infobar)

MSEdge

textblock remove_infobar
{
    "capabilities": {
        "alwaysMatch": {
            "browserName": "msedge",
            "ms:edgeOptions": {
                "args": [],
                "excludeSwitches": [
                    "enable-automation"
                ]
            }
        }
    }
}
endtextblock

driver = WebDriver.Edge(9515, remove_infobar)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment