はじめに
PythonでSeleniumを使ったスクレイピングを行っている際に、「ある時刻(例:16時)になったらクリックできるようになる」タイプのボタンに遭遇しました。
それまではクリックができず、プログラムが進まないという問題が発生したため、ボタンが有効になるまで自動でリロードし続ける方法を調べ、実装しました。
本記事では、その方法と注意点についてご紹介します。
状況の整理
対象のWebサイトでは、ボタンにdisabled
属性が付いており、有効な状態(クリック可能)になるまで操作ができませんでした。disabled
はHTMLでよく使われる属性で、「その要素を無効にする(操作できないようにする)」という意味があります。
このdisabled
属性の有無を利用すれば、ボタンが有効になったタイミングを検知することが可能です。
解決方法:disabled属性がなくなるまでリロードを繰り返す
以下のようなPythonコードで実現できます。
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
import time
browser = webdriver.Chrome(ChromeDriverManager().install())
while True:
try:
# disabled属性のある要素を探す
browser.find_element_by_class_name("disabled")
browser.refresh() # 見つかったらリロード
time.sleep(1) # サーバーへの負荷を考慮して待機
except Exception:
print("disabledが見つかりません。クリック可能な状態です。")
break
# この位置から次の処理を記述します(例:クリックなど)
プログラムの説明
import
文で必要なライブラリを読み込んでいます。while True:
でループを開始し、常にボタンの状態を監視します。browser.find_element_by_class_name("disabled")
で、無効状態のボタンを探します。- 見つかればページをリロードし、1秒の待機を入れてループします。
disabled
が見つからなければ例外が発生し、except
に処理が移ります。break
でループを抜け、次の操作(クリックなど)に進みます。
注意点:複数のボタンがある場合は使用不可
この方法には制限があります。たとえば、ページ内に複数のボタンがあり、その中に「まだ無効なボタン(disabled)」と「すでに有効なボタン」が混在している場合、ひとつでもdisabled
が存在すればリロードを繰り返してしまうため、うまく動作しません。
たとえば以下のようなケースでは不向きです。
- Aボタン(有効):1月6日にクリック可能
- Bボタン(無効):1月10日にクリック可能
この場合、Bボタンが常にdisabled
のままであるため、Aボタンがクリック可能であってもプログラムが先に進めません。
現時点では、「ページ内に対象のボタンがひとつだけ存在する」場合に限って使える方法です。
より柔軟に対応する方法が見つかれば、あらためて記事にまとめたいと思います。
おわりに
Seleniumを使った自動化では、サイト側の仕様(ボタンの有効化タイミングや属性の状態)を正確に把握することが重要です。今回のようにdisabled
属性の有無を監視することで、一定の条件が整うまで処理を保留することが可能となります。
本記事が同じような課題を抱えている方の参考になれば幸いです。
最後までお読みいただき、ありがとうございました。