Seleniumで「要素がクリックできない」をちゃんと安全に押す方法【Python/初心者向け・コピペOK】

Seleniumで「要素がクリックできない」をちゃんと安全に押す方法のアイキャッチ
  • URLをコピーしました!

Seleniumで「ボタンが押せない」「クリックしても反応しない」、
そんなときの原因はコードより押す前の準備不足であることが多いです。

この記事では、presence→visibility→scroll→clickableの順に
まず待つ→「ネイティブ→ActionChains→JS」の順に安全に押す→最後に本当に動いたか確認、という3ステップを、Pythonのコピペ用コード付きでまとめました。

この1冊で自動化の取っかかりをサクッと掴む

目次

この記事でできること

  • まず待つpresence → visibility → scroll → clickable の順に押せる状態を作る。
  • それでもダメなとき:クリックは ネイティブ → ActionChains → JS の順に安全にフォールバック
  • 失敗したとき少し待ってからもう一回(バックオフ)。ページをリロードしてやり直すのも有効。
  • 押したあとの確認:本当に動いたか、画面が更新されたかでチェックする。
ポイント

難しいテクニックより、「押せる前準備」+「安全クリック」+「結果確認」の3点セットで安全に着実に。

Seleniumでクリックできないときのよくある原因

  1. 見えてない:DOMにはあるけど display:none だったり、モーダルやヘッダーに隠れている。
  2. 画面外:ボタンが下の方にあって、まだスクロールされていない。
  3. まだ押せない状態:読み込み中/無効(disabled)/他の透明要素が上にかぶっている。
  4. 描画が遅い・揺れる:SPAや広告で要素の位置がコロコロ変わる。
  5. 一時的なエラー:エラーバナーや通信エラーで、そもそも操作を受け付けない。

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冊に

まとめ

  • 押せない原因の多くは「準備不足」(見えない・まだ押せない・画面外)。
  • 段階的に待機して押せる状態を作る安全クリック結果確認
  • これだけで、実運用でもほぼ安定します。まずは上の関数をそのままコピペしてみてください。
よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

当ブログの運営者であり全ての記事を書いた陰の者。
なんでも好きなものだけ書きます。
X(旧Twitter)でも更新情報とたまにくだらないことを発信中。
コメント解放しておりませんので、Xの方で感想いただけると嬉しくて更新が早くなる傾向にあります。調子乗りです。

目次