SeleniumeBasicで待機 usage_wait

リファレンス

 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)Step1Step2
 delegate有り(Waiter.Until)Step3Step4
 delegate有り(Driver.Until)Step5Step6
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
STEP
delegate無し 引数無し

WaitDelegate1関数でfalseを返し続けています。
While ( Waiter.Not(false) = True ) という状態が2秒継続され、タイムアウトによりエラーが発生します。

STEP
delegate無し 引数有り

WaitDelegate2関数に引数のdriverを渡してfalseを返し続けています。
While Waiter.Not(false) = True という状態が2秒継続され、タイムアウトによりエラーが発生します。

STEP
delegate有り 引数無し

関数のアドレスを返すAddressOf関数を利用しています。各引数は以下のとおり。
function = AddressOf WaitDelegate2
argument = null
timeout = 2000
Waiter.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。WaitDelegate2関数は引数にdriverを要求していますが、Untilの引数でdriverが無くても命令文は通ります。

STEP
delegate有り 引数有り

関数のアドレスを返すAddressOf関数を利用しています。各引数は以下のとおり。
function = AddressOf WaitDelegate1
argument = driver
timeout = 2000
Waiter.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。WaitDelegate1関数は引数の要求は無いですが、Untilの引数でdriverを指定しても命令文は通ります。

STEP
Driver.Until(delegate有り 引数無し)

Waiter.Until同様、AddressOf関数を利用しています。Driver.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。

STEP
Driver.Until(delegate有り 引数有り)

Waiter.Until同様、AddressOf関数を利用しています。Driver.Until自体でTrue or Falseの判断はせず、関数内のTrue or Falseに判断を委譲しています。WaitDelegate1関数は引数の要求は無いですが、Untilの引数でdriverを指定しても命令文は通ります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

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

目次