問題
StaleElementReferenceException(element is not attached to...)エラーを解決したい。
前提・実現したいこと
Phpwebdriverを使って、あるWEBサイトのスクレイピングをしています。
プログラム自体はほぼちゃんと動いていて、欲しいデータも拾えているのですが、
数百回に1度ほどの割合で、PHP Fatal errorが起こってしまうのを解決したいです。
※エラーはランダムで発生しています。
エラーの内容は以下です。
StaleElementReferenceException
1PHP Fatal error: Uncaught Facebook\WebDriver\Exception\StaleElementReferenceException: stale element reference: element is not attached to the page document 2 (Session info: headless chrome=69.0.3497.100)
試したこと
色々と調べましたところ、
・要素が現れるまで明示的に待機する
・try...catchで例外を投げてループし、成功するまでTRYさせる
上記の二つが有効かと思い、下記のコードで試してみました。
しかし、やはりまれにですが、同じエラーが起きてしまいます。。。
※エラーの際にループが実行すらされないので、コードの基本的なところも間違っているかもしれません。
php
1 2 3$try = 0;//失敗したときのTRY回数 4$condition = true;//要素取得の成否判定 5while($condition == true){ 6 //trueの間、5回まで試す。5回以上はエラーと判定しループを抜ける 7 if ($try > 5) { 8 $driver->quit(); 9 break; 10 } 11 try{ 12 //目的の要素が現れるまで明示的に待機してから要素を取得。 13 if ($driver->wait(5, 500)->until(WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::className("欲しい要素が入る"))))) { 14 $element = $driver->wait(5, 500)->until(WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::className("欲しい要素が入る"))); 15 $condition = false;//成功したらループを脱出 16 }else { 17 //失敗したら例外を投げる 18 throw new StaleElementReferenceException($element."が見つからない"); 19 } 20 }catch(StaleElementReferenceException $e){ 21 echo $e->getMessage(); 22 echo "失敗{$try}回目<br>"; 23 $try++; } 24 }
補足
根本的な解決ではないのですが、
エラーが起きてしまったときに、
プログラムを止めずその要素の取得だけ飛ばして、
次の処理に進めるという形での解決でも構わないです。
今のコードだとエラーが起きた時点でプログラムが止まってしまい
その後の処理が実行されないので、
可能であればそれだけでも回避できればうれしいです。
質問者のレベル
まだPHPおよびプログラミングをはじめて10ヶ月ほどの素人なので
try...catchの使い方など、基本的な知識が覚束ないところがあると思います。。。
アドバイスのほど、よろしくお願い致します。
あなたの回答
tips
プレビュー