はじめに
こんにちは。SeleniumでWebスクレイピングをしていると、click関数でボタンやリンクをクリックしてもイベントが発火しないことがあります。
driver.find_element(By.**, “xxx”).click()
こういった場合の対処方法をまとめたので、備忘録として残しておきます。
chromeDriver の状態
options = Options()
options.add_argument(“--headless”)
driver = webdriver.Chrome(get_driver_path(), chrome_options=options)
driver.get(“https://xxx.com”)
対処法
1. 画面内に要素を表示させてクリック
driverでWebページを開いたときに、スクロールしないと表示されない位置にある要素をクリックしようとしていた場合、解決する可能性があります。
まずはスクショを撮って現状を把握します。
driver.save_screenshot("save_image_path")
スクショを撮った結果表示されていない場合の対処法は2つあります。
まずはウィンドウサイズを大きくする方法です。
driver.set_window_size(1920, 1080)
次は指定の位置までスクロールします。
例ではページの一番下までスクロールしています。
driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);“)
上記を実行後再度スクショを撮り、表示されていることを確認した後にクリックすると、解決する場合があります。
2. サブミットする
ボタンのtypeがsubmitの場合、submit関数を直接呼び出すことで、解決する可能性があります。
<button type='submit'>submit ボタン</button>
やり方
driver.find_element(By.**, “xxx”).submit()
3. Enter キーを押す
上記と同じようにボタンのtypeがsubmitの場合、Enterキーを押します。
driver.find_element(By.**, “xxx”).send_keys(Keys.ENTER)
4. element の絶対位置を指定してクリック
クリックしたい要素の位置を取得し、座標指定でクリックします。
# 要素を取得
element = driver.find_element(By.**, “”)
# 座標を取得
loc = element.location
x, y = loc[“x”], loc[“y”]
# 座標指定でクリック
actions = ActionChains(driver)
actions.move_by_offset(x, y)
actions.click()
actions.perform()
ここからはdriver.execute_scriptでスクリプトを書いて実行する方法です。
5. 要素 のクリックを行うスクリプトを実行
ボタンをクリックするスクリプトを実行する方法です。
driver.execute_script(“arguments[0].click();“, driver.find_element(By.**, “”))
6. 要素 に埋め込まれているイベントを直接実行
driver.execute_script(“embedded_script”)
7. イベントと同じような処理を行うスクリプトを無理やり記述して実行
どうしてもできない場合は、WebページのHTMLを読み、submit関数で行っていることと同じようなスクリプトを愚直に記述して実行します。
driver.execute_script(“customize_script1")
driver.execute_script(“customize_script2”)
driver.execute_script(“customize_script3")
driver.execute_script(“customize_script4”)