<p>Seleniumでスクレイピングをしていると必ずエラーに遭遇します。よく出るエラーの原因と解決策をまとめました。</p>

<h3 id="h_nosuch">NoSuchElementException(要素が見つからない)</h3>
<p>最もよく出るエラーです。CSSセレクタやXPathが間違っているか、要素がまだ読み込まれていないケースがほとんどです。</p>
<pre><code># エラー例
NoSuchElementException: no such element: Unable to locate element</code></pre>
<p><strong>解決策1: セレクタを確認する</strong><br>
DevToolsで対象要素を右クリック → Copy → Copy selector でCSSセレクタを正確にコピーします。</p>
<p><strong>解決策2: 読み込み待ちを入れる</strong></p>
<pre><code>from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 要素が現れるまで最大10秒待つ
wait = WebDriverWait(driver, 10)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".target")))</code></pre>
<p><strong>解決策3: iframeの中にある</strong></p>
<pre><code>iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)
# iframe内の要素を操作
driver.switch_to.default_content() # 元に戻る</code></pre>

<h3 id="h_notinteract">ElementNotInteractableException(クリックできない)</h3>
<pre><code># エラー例
ElementNotInteractableException: element not interactable</code></pre>
<p>要素が非表示・無効化・他の要素に隠れているときに発生します。</p>
<pre><code># 解決策1: 要素が見えるまでスクロールしてからクリック
driver.execute_script("arguments[0].scrollIntoView(true);", elem)
time.sleep(0.5)
elem.click()

# 解決策2: JavaScriptでクリック(オーバーレイがある場合に有効)
driver.execute_script("arguments[0].click();", elem)

# 解決策3: 表示されるまで待つ
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn")))</code></pre>

<h3 id="h_timeout">TimeoutException(タイムアウト)</h3>
<pre><code># エラー例
TimeoutException: Message: timeout</code></pre>
<p>WebDriverWaitで指定した時間内に要素が現れなかった場合に発生します。</p>
<pre><code># 解決策1: 待ち時間を長くする
wait = WebDriverWait(driver, 30) # 10秒→30秒に延長

# 解決策2: 待つ条件を変える
# presence_of_element_located: DOMに存在する(非表示でもOK)
# visibility_of_element_located: 見えている状態になるまで待つ
wait.until(EC.visibility_of_element_located((By.ID, "result")))</code></pre>

<h3 id="h_stale">StaleElementReferenceException(要素が古い)</h3>
<pre><code># エラー例
StaleElementReferenceException: stale element reference</code></pre>
<p>ページ遷移やDOM更新後に、取得した要素を使おうとすると発生します。</p>
<pre><code># 解決策: ページ操作後に要素を取り直す
driver.find_element(By.CSS_SELECTOR, ".btn").click()
time.sleep(1) # ページ更新を待つ

# 再取得してから使う
elem = driver.find_element(By.CSS_SELECTOR, ".result") # 取り直し
print(elem.text)</code></pre>

<h3 id="h_webdriver">WebDriverException(Chromeが起動しない)</h3>
<pre><code># よく出るエラー
WebDriverException: unknown error: Chrome failed to start</code></pre>
<p>ChromeとChromeDriverのバージョンが合っていない、またはChromeのパスが見つからない場合に発生します。</p>
<pre><code># 解決策1: Selenium 4.6以上を使う(自動でバージョン管理される)
pip install --upgrade selenium

# 解決策2: Macでヘッドレスモードが動かないとき
options = Options()
options.add_argument("--headless=new") # 旧方式から変更
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")</code></pre>

<h3 id="h_select">セレクトボックスが操作できない</h3>
<pre><code># 解決策: Selectクラスを使う
from selenium.webdriver.support.ui import Select

select = Select(driver.find_element(By.ID, "prefecture"))

# テキストで選択
select.select_by_visible_text("東京都")

# 値で選択
select.select_by_value("tokyo")

# インデックスで選択
select.select_by_index(1)</code></pre>

<h3 id="h_ruby">Ruby Selenium の場合</h3>
<p>Ruby版Seleniumでも同様のエラーが出ます。</p>
<pre><code># Ruby: 要素が見つからないエラー対処
require "selenium-webdriver"

driver = Selenium::WebDriver.for :chrome
wait = Selenium::WebDriver::Wait.new(timeout: 10)

# 要素が現れるまで待つ
elem = wait.until { driver.find_element(:css, ".target") }

# JavaScriptでクリック
driver.execute_script("arguments[0].click();", elem)</code></pre>

<p>エラーの多くは「タイミング」の問題です。<code>time.sleep()</code>よりも<code>WebDriverWait</code>を使う習慣をつけると安定します。</p>