seleniumによるクリック処理でエラーになる原因と対処方法を紹介しています。
ボタンのクリックでエラーになる原因
- ボタン要素を取得出来ていない
- ボタンが非表示、無効化されている
- ボタンがブラウザの表示範囲外にある
エラーの対処方法
ボタン要素を取得出来ていない
単純にIDなどの指定が間違っている場合、要素が取得出来ていないためエラーになります。この場合は、要素を取得する処理にて引数が間違っていないか確認します。
下記の場合、第一引数が”ID指定”、第二引数が”要素のID”となっています。
from selenium import webdriver
from selenium.webdriver.common.by import By
# 起動するブラウザを設定
driver = webdriver.Chrome()
# URLを指定して実行
driver.get('https://*****')
# 要素を取得
btn = driver.find_element(By.ID, 'btnID')
# ボタンをクリック
driver.execute_script("arguments[0].click();", btn)
他には、ボタンは存在しているはずだが、読み込まれる前に処理を行ってしまっている場合があります。この場合は、存在するはずのボタンが読み込まれるまで待ってから処理を行うように修正します。
WebDriverWait.until()は、指定した条件を満たすまで待機する関数です。下記の場合、element_to_be_clickable()を指定しているため、要素がクリックできるようになるまで待機します。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# 起動するブラウザを設定
driver = webdriver.Chrome()
# URLを指定して実行
driver.get('https://*****')
# ボタンがクリック可能になるまで待機して要素を取得
btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, 'btnID'))
)
# ボタンをクリック
driver.execute_script("arguments[0].click();", btn)
ボタンが非表示、無効化されている
ボタン要素そのものが非表示もしくは無効化されていると、クリック処理でエラーになります。この場合は、フロント側の制御を見直しましょう。
ボタンがブラウザの表示範囲外にある
ボタンが表示されていても、ブラウザの表示範囲外に存在しているとエラーになる場合があります。この場合は、スクロール処理を挟むことで回避できます。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# 起動するブラウザを設定
driver = webdriver.Chrome()
# URLを指定して実行
driver.get('https://*****')
# ボタンがクリック可能になるまで待機して要素を取得
btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, 'btnID'))
)
# 要素をスクロールして表示
driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", btn)
# ボタンをクリック
driver.execute_script("arguments[0].click();", btn)