SeleniumBasicで待機する構文を紹介します。待機の方法は幾つかあるかと思いますが、今回はExamplesに掲載されている内容を説明します。今回紹介するメソッドはあまり馴染みが無いし、直観的に利用できないので扱いに慣れが必要になるかと思います。
- 利用目的は業務効率化です。(テスト自動化ではありません)
- ブラウザはGoogleChromeが対象です。(EdgeやFirefoxは対象外)
- 原文のVBAでは現在エラー発生する場合が多いため、修正を加えてます。
Examples.xlsmの保存場所(ここをクリック)
Examples.xlsmが保存されている場所は、SeleniumBasicがインストールされているサブフォルダ内になります。SeleniumBasicのインストール完了時に保存フォルダを確認することができます。ただ、大体以下フォルダのどちらかにファイル保存されています。
- C:\Program Files\Seleniumbasic\Examples\Excel
- shell:Local AppData\SeleniumBasic\Examples\Excel
delegate(デリゲート)は、直訳すると"委譲"になるのですが、SeleniumBasicでの利用では戻り値を関数に任せる事を指していそうです。開発用語なので、ユーザの立場ではあまり気にしなくても良いかと思います。各メソッドの説明は、VBE内のライブラリ内容を参照しました。
・Waiter.Not
Function Not(result, [timeout As Long = -1], [timeoutMessage As String]) As Boolean
説明文は、"Returns a boolean to continue looping and throws an exception if the timeout(ms) is reached."でした。直訳すると、"ブール値を返し、ループを継続し、更に指定した時間のタイムアウトになったら例外を投げる"といった感じでしょうか。
Waiter.NotクラスにBooblean型が定義されています。True or Falseの戻り値は関数自身に定義されており、関数内のTrue or Falseに委譲していない、ということだと思われます。
・Waiter.Until
Function Until(function, [argument], [timeout As Long = -1], [timeoutMessage As String])
説明文は、"Waits for the given function to return true."でした。 直訳すると、"与えられた関数が true を返すまで待機する"といった感じでしょうか。注目すべきは、Untilクラスには変数定義がされていない、ということです。True or Falseの戻り値は関数内の値に委譲しています。
今回の構文は一つですが、各ステップは以下の様に分類できます。各ステップでタイムアウトによりエラーが発生しますので、デバック状態でドラッグ&ドロップで次の命令文に進んでください。
※Step3~6は、64bit版Officeで実行すると動作不能でエラーが発生します。現状、32bit版Officeのみ動作確認ができています。
引数 無し | 引数 有り | |
---|---|---|
delegate無し(Waiter.Not) | Step1 | Step2 |
delegate有り(Waiter.Until) | Step3 | Step4 |
delegate有り(Driver.Until) | Step5 | Step6 |
Private Sub Should_Wait_For_Delegate()
Dim driver As New ChromeDriver
Dim Waiter As New selenium.Waiter
'Step1 delegate無し 引数無し
While Waiter.Not(WaitDelegate1(), timeout:=2000): Wend
'Step2 delegate無し 引数有り
While Waiter.Not(WaitDelegate2(driver), timeout:=2000): Wend
'Step3 delegate有り 引数無し
Waiter.Until AddressOf WaitDelegate2, timeout:=2000
'Step4 delegate有り 引数有り
Waiter.Until AddressOf WaitDelegate1, driver, timeout:=2000
'Step5 ChromeDriverクラスのUntilメソッド利用(delegate有り 引数無し)
driver.Until AddressOf WaitDelegate1, timeout:=2000
'Step6 ChromeDriverクラスのUntilメソッド利用(delegate有り 引数有り)
driver.Until AddressOf WaitDelegate1, driver, timeout:=2000
End Sub
Private Function WaitDelegate1()
WaitDelegate1 = False
End Function
Private Function WaitDelegate2(driver As WebDriver)
WaitDelegate2 = False
End Function
WaitDelegate1関数でfalseを返し続けています。
While ( Waiter.Not(false) = True ) という状態が2秒継続され、タイムアウトによりエラーが発生します。
WaitDelegate2関数に引数のdriverを渡してfalseを返し続けています。
While Waiter.Not(false) = True という状態が2秒継続され、タイムアウトによりエラーが発生します。
関数のアドレスを返すAddressOf関数を利用しています。各引数は以下のとおり。
function = AddressOf WaitDelegate2
argument = null
timeout = 2000
Waiter.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。WaitDelegate2関数は引数にdriverを要求していますが、Untilの引数でdriverが無くても命令文は通ります。
関数のアドレスを返すAddressOf関数を利用しています。各引数は以下のとおり。
function = AddressOf WaitDelegate1
argument = driver
timeout = 2000
Waiter.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。WaitDelegate1関数は引数の要求は無いですが、Untilの引数でdriverを指定しても命令文は通ります。
Waiter.Until同様、AddressOf関数を利用しています。Driver.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。
Waiter.Until同様、AddressOf関数を利用しています。Driver.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。WaitDelegate1関数は引数の要求は無いですが、Untilの引数でdriverを指定しても命令文は通ります。