Selenium の一般的な JavaScript エラーの理解と修正
Webスクレイピングを行う場合 Selenium Webドライバー、特に次のような動的な Web 要素を扱う場合、JavaScript 関連のエラーが発生することは珍しいことではありません。 シャドウ DOM。開発者がよく直面するエラーの 1 つは、 JavascriptException: null のプロパティを読み取れません (「shadowRoot」の読み取り)これは、複雑なページ要素を操作するときによく発生します。
このエラーは通常、Selenium がオブジェクト内の要素にアクセスできない、または要素と対話できない場合に発生します。 シャドウDOM、モジュール性を高めるために多くの最新の Web サイトで使用されている、独自のタイプのカプセル化された DOM 構造。 Python では、このような要素を使用する場合、Selenium を使用してブラウザを制御するのは難しい場合があります。
Shopee などのプラットフォームからの Web スクレイピングのコンテキストでは、ポップアップやバナーはシャドウ DOM を使用することが多く、プログラムで閉じるのが難しい場合があります。この問題により、自動化されたタスクのスムーズな流れが妨げられ、データ収集が中断される可能性があります。
このガイドでは、次のような問題に対処するための明確な解決策を説明します。 「Null のプロパティを読み取れません」 エラーを解決し、Shopee のシャドウ DOM 内に埋め込まれたポップアップを閉じるための実用的なアプローチを提供します。 Python セレン。
指示 | 使用例 |
---|---|
shadowRoot | これは、Shadow DOM 内の要素にアクセスするために使用されます。 Shadow DOM は特定の要素をメイン DOM ツリーから分離し、それらにアクセスするにはshadowRoot プロパティを必要とします。このスクリプトでは、ポップアップ内の閉じるボタンを見つけるために使用されます。 |
execute_script() | この Selenium メソッドを使用すると、ブラウザ セッション内で生の JavaScript を実行できます。従来の Selenium メソッドが機能しない可能性があるため、Shadow DOM 要素を操作する場合はこれが不可欠です。 |
WebDriverWait() | このコマンドは、Selenium で明示的な待機を設定します。これにより、要素がクリック可能になるなど、指定された条件が満たされるまでスクリプトが待機するようになります。これは、Shopee のポップアップで見られるように、動的なコンテンツの読み込みにとって重要です。 |
expected_conditions | このモジュールには、要素の可視性や存在など、WebDriverWait で使用できる条件が含まれています。これにより、クリックなどの操作は、対象の要素の準備ができた場合にのみ行われるようになります。 |
EC.presence_of_element_located() | 対象の要素が DOM 内に存在することを確認するために WebDriverWait で使用される条件。これは、Shadow DOM 内の要素がロードされるのを待機するときに特に役立ちます。 |
EC.element_to_be_clickable() | WebDriverWait のもう 1 つの便利な条件です。これにより、操作を試みる前に対象の要素が表示され、クリック可能になることが保証され、動的 Web ページでのエラーが軽減されます。 |
By.CSS_SELECTOR | この方法では、CSS セレクターを介して要素を検索できます。これは、標準の XPath メソッドを使用してアクセスできない可能性があるシャドウ DOM 内の要素をターゲットにする場合に特に役立ちます。 |
driver.quit() | スクリプトの実行終了後にブラウザ インスタンスが適切に閉じられるようにします。ブラウザー セッションを開いたままにしないようにすることが重要なベスト プラクティスです。 |
Selenium Web スクレイピングでシャドウ DOM とポップアップを処理する方法
上記で提供されているスクリプトは、Web スクレイピングで発生する一般的な問題に対処することを目的としています。 Selenium Webドライバー Shadow DOM 要素を操作するとき。シャドウ DOM は、メイン DOM とは別に動作する Web ページの一部であり、複雑な Web コンポーネントでよく使用されます。 Shopee のようなスクレイピング サイトのコンテキストでは、シャドウ DOM 内にポップアップが頻繁に表示され、従来の Selenium メソッドでアクセスするとエラーが発生する可能性があります。最初のスクリプトは、JavaScript の実行を使用してポップアップを閉じるように設計されています。 実行スクリプト()、Selenium がブラウザー コンテキスト内で生の JavaScript を実行できるようにする強力なツールです。
重要な課題は、Shadow DOM 内の要素に、次のような一般的な Selenium コマンドではアクセスできないことです。 find_element_by_xpath()。代わりに、JavaScript を使用してシャドウ DOM にアクセスします。 シャドウルート 財産。このスクリプトは、まず Shopee ポップアップのシャドウ ホスト要素にアクセスし、次にその内部構造をクエリすることによって、Shopee ポップアップの閉じるボタンをターゲットにします。活用することで driver.execute_script()を使用すると、スクリプトはこの分離された DOM 内の要素を操作したり閉じることができます。このソリューションは、非同期で読み込まれる動的ページ要素を処理するための明示的な待機と組み合わせるとうまく機能します。
2 番目のスクリプトの紹介 WebDriverWait、動的なページ要素のタイミングを管理するために不可欠なツールです。 Shopee のポップアップは非同期で読み込まれるため、これらの要素を直接操作するとエラーが発生する可能性があります。これを回避するには、 WebDriverWait() 対話したい要素が完全にロードされ、準備ができていることを確認します。このスクリプトは、メイン DOM 要素とシャドウ DOM 要素の両方が存在するのを待ちます。方法 EC.presence_of_element_located() これは、null 参照エラーを回避するために重要です。
どちらのスクリプトでも、エラー状況を次のように処理します。 例外を試みる ブロックを使用して、要素が見つからないなどの予期しないエラーによってプログラムがクラッシュしないようにします。エラー処理は、構造を頻繁に更新したり、ポップアップの動作を変更したりする Web サイトをスクレイピングする場合に特に重要です。さらに、これらのスクリプトはベスト プラクティスに従い、次を使用してブラウザ セッションを終了します。 driver.quit() メモリリークやパフォーマンスの問題を避けるために実行後に。
Python の Selenium を使用してシャドウ DOM を処理し、ポップアップを閉じる
Python と Selenium WebDriver を使用して、Shadow DOM 要素と対話し、ポップアップを動的に処理します。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import JavascriptException
import time
# Initialize WebDriver with Chrome
options = Options()
driver = webdriver.Chrome(service=Service(), options=options)
# Open Shopee website
driver.get('https://www.shopee.co.th/')
# Click the Thai language button
th_button = driver.find_element(By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button')
th_button.click()
# Pause to allow popups to load
time.sleep(3)
# Try to close the shadow DOM popup
try:
close_button = driver.execute_script('return document.querySelector("shopee-banner-popup-stateful")'
'.shadowRoot.querySelector("div.shopee-popup__close-btn")')
close_button.click()
except JavascriptException as e:
print("Error: ", e)
# Close the browser
driver.quit()
Shadow DOM インタラクションに WebDriverWait を使用する
Selenium で明示的な待機を使用して、Shadow DOM 内の要素が対話の準備ができていることを確認します。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# Initialize WebDriver with Chrome
options = Options()
driver = webdriver.Chrome(service=Service(), options=options)
# Open Shopee website
driver.get('https://www.shopee.co.th/')
# Click the Thai language button
th_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '/html/body/div[2]/div[1]/div[1]/div/div[3]/div[1]/button'))
)
th_button.click()
# Wait for the shadow DOM popup to be present
try:
shadow_host = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, 'shopee-banner-popup-stateful'))
)
shadow_root = driver.execute_script('return arguments[0].shadowRoot', shadow_host)
close_button = shadow_root.find_element(By.CSS_SELECTOR, 'div.shopee-popup__close-btn')
close_button.click()
except Exception as e:
print("Error closing the popup: ", e)
# Close the browser
driver.quit()
Selenium WebDriver を使用した動的コンテンツの処理
Web スクレイピングのために Selenium WebDriver を使用するときに考慮すべきもう 1 つの重要な側面は、 動的コンテンツ ページの読み込み後に継続的に更新または変更されます。 Shopee などの最近の Web サイトの多くは、JavaScript を使用してコンテンツを動的に読み込み、更新します。これは、ページの読み込み後、ページ上の要素がすぐには使用できない可能性があることを意味します。このような場合、ページ読み込みイベントを待機する Selenium のデフォルトの動作では十分ではない可能性があります。次のような明示的な待機を使用する WebDriverWait この問題は、特定の要素が表示されるかクリック可能になるまで待つことで解決できます。
ポップアップ、バナー、または依存する複雑な UI コンポーネントを含むサイトのスクレイピング用 シャドウ DOM、彼らと対話する方法を知ることが不可欠です。これらのコンポーネントは、XPath や CSS セレクターなどの従来の方法ではアクセスできない分離された DOM 構造内の要素を隠します。を使用して、 実行スクリプト() コマンドを使用すると、ブラウザ内で JavaScript を直接実行できるようになり、シャドウ DOM にアクセスできるようになり、ページの非表示部分にある閉じるボタンやフォーム フィールドなどの要素との対話が可能になり、このギャップを埋めるのに役立ちます。
さらに、このような場合にはエラー処理が重要になります。 Web サイトの構造が変更されることがよくあり、スクレイパーが壊れる可能性があります。適切な使用法 例外を試みる Python のブロックを使用すると、次のようなエラーをキャッチできます。 JavaScript例外 スクレーパーが予期せずクラッシュしないように、適切に処理してください。ログを組み込んでエラーの詳細を取得すると、根本原因を特定し、今後のスクレイピングで解決するのに役立ちます。
Selenium でのシャドウ DOM とポップアップの処理に関するよくある質問
- Shadow DOM とは何ですか? なぜアクセスが難しいのでしょうか?
- の shadow DOM は、Web 開発者が要素をカプセル化し、メイン ドキュメント内のスタイルやスクリプトによる影響を防ぐために使用する分離された DOM ツリーです。従来の Selenium メソッドは Shadow DOM 要素との直接対話をサポートしていないため、アクセスするのが困難です。
- どのようにして execute_script() Shadow DOM との対話を支援しますか?
- execute_script() ブラウザ セッション内で JavaScript を直接実行できるため、通常の Selenium コマンドを使用してアクセスできないシャドウ DOM 要素にアクセスできるようになります。
- なぜですか WebDriverWait 動的コンテンツをスクレイピングするのに重要ですか?
- WebDriverWait スクリプトが要素と対話する前に、要素がクリック可能であるか存在しているかなどの特定の条件を待機するようにします。これは、非同期で読み込まれる動的コンテンツを処理するために重要です。
- 遭遇したらどうすればいいですか JavascriptException?
- JavascriptException JavaScript コードの実行に問題がある場合に発生します。を使用してエラー処理を実装する try-except ブロックは、スクリプト全体をクラッシュさせることなく、これらのエラーを検出して管理するのに役立ちます。
- Shadow DOM を使用する動的ポップアップを閉じるにはどうすればよいですか?
- シャドウ DOM にカプセル化された動的ポップアップを閉じるには、まず次のコマンドを使用してシャドウ ルートにアクセスする必要があります。 execute_script() 次に、Shadow DOM 内でポップアップを閉じるボタンを見つけます。
Selenium での Shadow DOM の処理に関する最終的な考え
Web スクレイピングに Selenium を使用する場合、Shadow DOM 要素との対話は困難になる場合があります。ただし、JavaScript の実行と明示的な待機を利用することで、標準のメソッドではアクセスが難しい要素を効果的に管理できます。
エラーを適切に処理し、待機を組み込むことで、スクレイピング スクリプトが堅牢で信頼性の高いものであることを保証できます。これらのテクニックは、シャドウ DOM に埋め込まれた動的コンテンツやポップアップを操作するときによくある落とし穴を回避し、よりスムーズなスクレイピング エクスペリエンスを保証するのに役立ちます。
Selenium で Shadow DOM を処理するための役立つソースとリファレンス
- Selenium での Shadow DOM 要素との対話に関する情報は、次のとおりです。 Selenium WebDriver ドキュメント 。
- JavascriptException エラーの処理に関する洞察 スタックオーバーフロー 。
- を使用して動的コンテンツを Web スクレイピングするためのベスト プラクティスに関するガイダンス リアルパイソン 。