2013年3月15日金曜日

Wait.until()で指定できる状態の種類

Selenium2でテストを書いていく際, 何かとお世話になるのが Wait<WebDriver>.until(). 「引数に指定した状態になるまで」待機してくれるのだが, この状態の指定のメソッドが多すぎる上に, いちいち英語読むのがダルげふんげふん説明が単調なのでまとめてメモメモφ(・ω・ )
ちなみに 「何言ってんだコイツ?(・д・`)」と感じられたら, こちらの本家へジャンプ.
またこちらでメソッドの中身を見るのもいいかも.

Wait.until()の指定できる「状態」


1. 準備


・インポートと宣言

import org.openqa.selenium.support.ui.Wait;
import static org.openqa.selenium.support.ui.ExpectedConditions.*;

WebDriver driver = new ChromeDriver();
Wait<webdriver> wait = new WebDriverWait(driver, 10);
まずは準備. newする際に, 待機を指示する WebDriverの指定と, 最大待機時間を宣言. 今回は 10秒を指定. もちろん 10を 20に置き換えれば最大 20秒待機となる. この待機時間を過ぎると,
org.openqa.selenium.TimeoutException
が発生し, テストはそこで failとなる.
逆にこの最大待機時間内に conditionが整えば, わざわざ最大待機時間まで待機せずに先に進んでくれる.
Thread.sleep(10000);
とかするよりよっぽどスマート.


・until

wait.until(ExpectedCondition condition);
wait.until()を呼び出す. この引数に以下に紹介する conditionを設定して渡してやればOK.
たとえば titlesで状態を設定したいなら,
wait.until(titles("期待するタイトル"));
としてやる.
使い方自体はシンプルなのだが, 問題はこの「期待する状態の設定」の方になる.


2. conditionの設定

・titles

public static ExpectedCondition<java.lang.Boolean> titleIs(java.lang.String title)
「ページのタイトルが titleに一致するまで」待機.
・titleContains

public static ExpectedCondition<java.lang.Boolean> titleContains(java.lang.String title)
「ページのタイトルに titleが含まれるまで」待機.
・presenceOfElementLocated

public static ExpectedCondition<WebElement> presenceOfElementLocated(By locator)
「引数に指定した locatorがDOMに現れるまで」待機. ただし待機終了時に, 必ずしもそれが画面に表示されているとは限らない.
・visibilityOfElementLocated

public static ExpectedCondition<WebElement> visibilityOfElementLocated(By locator)
↑に近く, 「引数に指定した locatorがDOMに現れるまで」待機.こちらは画面に表示されたうえで, それが0より大きい幅高さを持って存在している状態になるまで待機する.
・visibilityOf

public static ExpectedCondition<WebElement> visibilityOf(WebElement element)
visibilityOfElementLocatedに近いが, こちらは「引数に指定した elementがDOMに現れるまで」待機. ”画面に表示される”の定義も visibilityOfElementLocatedと同じ.
・presenceOfAllElementsLocatedBy

public static ExpectedCondition<java.util.List<WebElement>> presenceOfAllElementsLocatedBy(By locator)
「引数に指定した locatorが, ページ上に少なくとも一つ存在するまで」待機. 見えるかどうかは問わないらしい.
・textToBePresentInElement

public static ExpectedCondition<java.lang.Boolean> textToBePresentInElement(By locator, java.lang.String text)
「引数に指定した textが, 指定した locatorに textとして現れるまで」待機. 要するに指定した locatorでgetText()したら textがとれるようになるまで待機?
・textToBePresentInElementValue

public static ExpectedCondition<java.lang.Boolean> textToBePresentInElementValue(By locator, java.lang.String text)
↑に近いが, こちらは「引数に指定した textが, 指定した locatorの valueとして現れるまで」待機.
・frameToBeAvailableAndSwitchToIt

public static ExpectedCondition<WebDriver> frameToBeAvailableAndSwitchToIt(java.lang.String frameLocator)
「指定した frameLocatorに WebDriverが移動するまで」待機?そもそもframeがよくわかってないし, ここを見た分には, このメソッドでそのまま移動しそうな switchTo()が呼ばれてるけどどういうことなんだろう…
・invisibilityOfElementLocated

public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementLocated(By locator)
今度は「引数に指定した locatorが, 見えなくなるかDOM上からいなくなるまで」待機. "見えなくなる"の定義はないのかな…(・ω・`)
・invisibilityOfElementWithText

public static ExpectedCondition<java.lang.Boolean> invisibilityOfElementWithText(By locator, java.lang.String text)
「 textで指定した要素が, locatorで指定したエレメントから, 見えなくなるかDOM上からいなくなるまで」待機, …でいいのかな.
・elementToBeClickable

public static ExpectedCondition<WebElement> elementToBeClickable(By locator)
「 locatorで指定したエレメントが, 画面上に表示され, かつクリックできる状態になる」まで待機.
・stalenessOf

public static ExpectedCondition<java.lang.Boolean> stalenessOf(WebElement element)
「 elementがDOMに付属しなくなるまで」待機. ページのリロードなどでDOMが置き換わるなどするときに, "指定した elementがDOMからちゃんと消えるまで"待つ, ってこと? 参考
refreshed

public static <T> ExpectedCondition<T> refreshed(ExpectedCondition<T> condition)
このメソッド…無くなってる…?まぁ正直どういう動きか微妙に想像つかないけど(・ω・`)
・elementToBeSelected

public static ExpectedCondition<java.lang.Boolean> elementToBeSelected(WebElement element)
「指定した elementが選択された状態になるまで」待機. チェックボックスとかに使うんだろうけど, どこで判断してるんだろう…
・elementSelectionStateToBe

public static ExpectedCondition<java.lang.Boolean> elementSelectionStateToBe(WebElement element, boolean selected)
ほぼ↑と同じ気が…. 「指定した elementが selectedで指定した状態に選択 された/されていない 状態になるまで」待機. こっちで統一してもいい気がする…. 説明文とかコピペを疑うし…
・elementToBeSelected

public static ExpectedCondition<java.lang.Boolean> elementToBeSelected(By locator)
↑の locator版?「 locatorで指定したエレメントが選択された状態になるまで」待機, 当たりか. 説明すら放棄されましたorz
・elementSelectionStateToBe

public static ExpectedCondition<java.lang.Boolean> elementSelectionStateToBe(By locator, boolean selected)
「 locatorで指定したエレメントの選択状態が, selectedで指定した状態になるまで」待機, でいいのかな? もはや説明不要といわんばかりの勢い
・alertIsPresent

public static ExpectedCondition<Alert> alertIsPresent()
おそらく「アラートが出るまで」待機. 見たまんまでも説明がないと不安になりますよ…('A`)
not

public static ExpectedCondition<java.lang.Boolean> not(ExpectedCondition<?> condition)
シンプルに否定. 「引数に指定した conditionの notの状態になるまで」待機. …ってこのメソッドも無くなってるし( ゚д゚ )使えそうとか思ったのに…(;ω;`)


とりあえず以上. なんか無くなってるのか違うとこ見てるのかわからないのが2つほどあったけど…






枠とか試してみたけど…レイアウトって難しい(・ω・`)

1 件のコメント:

  1. invisibilityOfElementLocatedはDOMに含まれているが見えない状態を判定するのではないでしょうか。

    返信削除

AWS CDKで立てたEC2インスタンスのTimeZoneとかいじりたかった話

EC2を立てることはできたけど、立てたインスタンスは UTCのままだし設定ファイルとかいちいちscpしてくるのはダルい。 当初UserDataでなんとかしようとしたものの、「書く量がヤバいしメンテしにくい」と悩んでいたところ見かけたのが  AWS::CloudFormation:...