Seleniumで「ボタンが押せない」「クリックしても反応しない」、
そんなときの原因はコードより押す前の準備不足であることが多いです。
この記事では、presence→visibility→scroll→clickableの順に
まず待つ→「ネイティブ→ActionChains→JS」の順に安全に押す→最後に本当に動いたか確認、という3ステップを、Pythonのコピペ用コード付きでまとめました。
\ この1冊で自動化の取っかかりをサクッと掴む /
この記事でできること
- まず待つ:
presence → visibility → scroll → clickableの順に押せる状態を作る。 - それでもダメなとき:クリックは ネイティブ → ActionChains → JS の順に安全にフォールバック。
- 失敗したとき:少し待ってからもう一回(バックオフ)。ページをリロードしてやり直すのも有効。
- 押したあとの確認:本当に動いたか、画面が更新されたかでチェックする。
難しいテクニックより、「押せる前準備」+「安全クリック」+「結果確認」の3点セットで安全に着実に。
Seleniumでクリックできないときのよくある原因
- 見えてない:DOMにはあるけど
display:noneだったり、モーダルやヘッダーに隠れている。 - 画面外:ボタンが下の方にあって、まだスクロールされていない。
- まだ押せない状態:読み込み中/無効(disabled)/他の透明要素が上にかぶっている。
- 描画が遅い・揺れる:SPAや広告で要素の位置がコロコロ変わる。
- 一時的なエラー:エラーバナーや通信エラーで、そもそも操作を受け付けない。
Seleniumでクリックできないときの対処法(Python・コピペOK)
\ 本記事のコードと相性◎ 実務寄りのスクレイピング指南 /
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import time
def wait_button_ready(driver, by, locator, timeout=20, poll=0.35):
"""
1) DOMに出る → 2) 目に見える → 3) 画面中央へスクロール → 4) クリックできる
の順で“押せる状態”を作ります。
"""
w = WebDriverWait(driver, timeout, poll)
el = w.until(EC.presence_of_element_located((by, locator)))
el = w.until(EC.visibility_of_element_located((by, locator)))
try:
driver.execute_script("arguments[0].scrollIntoView({block:'center'});", el)
except Exception:
pass
el = w.until(EC.element_to_be_clickable((by, locator)))
return el
def safe_click(driver, el):
"""クリックの三段活用:ネイティブ→ActionChains→JS。"""
# 念のため中央へスクロール(ヘッダーかぶり対策)
try:
driver.execute_script("arguments[0].scrollIntoView({block:'center'});", el)
except Exception:
pass
# 1) ふつうにクリック
try:
el.click()
return "native"
except Exception:
pass
# 2) ActionChainsでクリック(hover→小休止→click)
try:
ActionChains(driver).move_to_element(el).pause(0.2).click().perform()
return "actions"
except Exception:
pass
# 3) 最後の手段:JavaScriptでクリック
driver.execute_script("arguments[0].click();", el)
return "js"使い方(最小例)
from selenium.webdriver.common.by import By
# 例:id="save" のボタンを押したい
btn = wait_button_ready(driver, By.ID, "save")
clicked_by = safe_click(driver, btn)
print("clicked:", clicked_by) # native / actions / js のどれで押せたか
# ほんとうに動いたかを軽く確認(任意)
_ = wait_submitted(driver, btn, timeout=7) # True/False を無視してもOKログに「どの方法で押せたか」を残すと、サイト側の変更に気づきやすくなります。
失敗したときのリトライ(ゆっくり落ち着いて)
クリック連打は逆効果。少し待ってから再挑戦しましょう。
import random, time
def small_backoff(attempt):
# 1回目0.5秒 → 2回目1秒 → 3回目2秒 …のように少しずつ長くする
base = 0.5 * (2 ** attempt)
return base * random.uniform(0.9, 1.2)
def click_with_retry(driver, by, locator, tries=4):
last_err = None
for i in range(tries):
try:
btn = wait_button_ready(driver, by, locator, timeout=15)
how = safe_click(driver, btn)
return True, how
except Exception as e:
last_err = e
time.sleep(small_backoff(i)) # 少し待ってから再挑戦
return False, str(last_err)簡易エラー検知→リロード
ページに「エラーが発生しました」などの文言が見えたら、一度リロードしてから再トライすると安定します。
# ページに「エラーが発生しました」が含まれていたらリロード→少し待つ→再挑戦
if "エラーが発生しました" in driver.page_source:
driver.refresh()
time.sleep(1.5)「押したあと」も大事:本当に動いたかチェック
押すだけで満足しないで、画面が切り替わったかも見ます。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
# 押したボタン(要素)が古くなったら=画面が更新された合図
def wait_submitted(driver, el, timeout=7):
try:
WebDriverWait(driver, timeout, 0.3).until(EC.staleness_of(el))
return True
except TimeoutException:
return False- 送信ボタンのDOMが無効(stale)になれば、ページに何かしらの変化が起きています。
- 変化がない場合は、JSクリックをもう一度試すか、リロードしてやり直し。
チェックリスト(これで大体うまくいきます)
- まず 見える・押せる まで待っている(
wait_button_ready)。 - クリックは ネイティブ → ActionChains → JS の順に試している。
- 失敗しても連打せず、少し待ってから再挑戦している。
- 押したあと、画面が更新されたかを確認している(
staleness_ofなど)。
どうしてもダメなときの最終手段
- ページをリロードしてからやり直す。
- 透明な要素が上にかぶっている場合は、少しスクロールしてからクリック。
# stickyヘッダー等でボタンが隠れるときの微調整
driver.execute_script("window.scrollBy(0, -120);")JSクリックは“最後の手段”。まずは正攻法(待機→安全クリック)を試しましょう。
よくある質問(FAQ)
- JSクリックは最初から使っていい?
-
できれば最後に。見た目だけ押せて実際は処理が走らないことがあるため。
implicit waitは使わない?-
衝突しやすいので基本は
explicit wait(今回の関数) で十分です。 - 座標クリックは?
-
レイアウトが少し動くと外しやすいので、通常はおすすめしません。
よく出るエラー例:ElementClickInterceptedException(要素の上に何かが被っている)、ElementNotInteractableException(要素がまだ操作不可) など。
\ 図解でやさしい:最初の1冊に /
まとめ
- 押せない原因の多くは「準備不足」(見えない・まだ押せない・画面外)。
- 段階的に待機して押せる状態を作る → 安全クリック → 結果確認。
- これだけで、実運用でもほぼ安定します。まずは上の関数をそのままコピペしてみてください。

