seleniumでハマったエラーのメモ。ループ内でごにょごにょして、次ページのリンクをクリックして、またループ・・・という流れだったのだが、題名のエラーが出てハマった。
結論から言うと、クリック後にsleepを入れてあげて解決した。
全ての処理は書いていないが、大体以下の流れ。
//ページを取得する処理など
...
$next = false;
do {
// ページ表示を待つ
$driver->wait(3)->until(
WebDriverExpectedCondition::elementTextContains(WebDriverBy::xpath('//div'), '検索結果')
);
// リストのブロックを見つける
$elements = $driver->findElements(WebDriverBy::cssSelector('.value-list'));
foreach ($elements as $element) {
////////////////////////////////////////////
// 2回目以降落ちるのはこの辺り
////////////////////////////////////////////
$id = $element->findElement(WebDriverBy::xpath(''//div[@class="id"]))->getText();
...
}
// 次のページのリンクがあるか確認
$nextPage = $driver->findElements(WebDriverBy::cssSelector('a .next'));
// なければ終了
if (empty($nextPage)) {
$next = false;
// あればリンクをクリック
} else {
$next = true;
$driver->findElement(WebDriverBy::cssSelector('a .next'))->click();
sleep(3); // <<<<< これを追加
}
while ($next);
clickでループ処理の1回目を終えて、次のページでまた処理をする流れで、ループの初めにはページの表示を待つ処理を入れているのだが、クリックのタイミングでsleepを入れないと次のループでエラーが出て落ちてしまうのでsleepを入れた。
調べた感じだとクリックを行った後にページの表示を待たずに処理をしてしまうため、エラー落ちしている場合が多い様。今回はwaitで表示待ちしている部分より下が表示しきっていないのにそのままループの処理が進んでしまって落ちていたようだった。
コメント