Selenium、presenceOfElementLocatedとvisibilityOfElementLocatedの違いに気をつけよう

seleniumでexpected conditionを使ってwaitするときに、

$this->driver->wait()->until(
    WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::id('hoge'))
);

$this->driver->wait()->until(
    WebDriverExpectedCondition::visibilityOfElementLocated(WebDriverBy::id('hoge'))
);

のどちらかで迷う時があると思うのですが、そんな時にどっちを使えばいいのかは、のちにどんな処理をするのかで判断しましょう。

presenceOfElementLocatedは要素がDOMに存在するまでWaitをするので、 たとえDOMにあるからといって画面に表示されているとは限りません(実際はDOMがロードされた後にelementがブラウザ上に表示されるので少し時間がかかります。)。 なのでこのwaitの後に「要素をクリックしたい時」とか「要素が視認可能か確認したい時」などはこの処理は向きません

ただWaitの後にテキストの内容やタイトルとかをサクッと確認したい時は

$this->driver->wait()->until(
    WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::id('hoge'))
);

Waitの後に要素をクリックしたりスクロールしたりしたい時は

$this->driver->wait()->until(
    WebDriverExpectedCondition::visibilityOfElementLocated(WebDriverBy::id('hoge'))
);

を使うようにしましょう。