如何通过Python和Selenium点击#shadow-root(关闭)中的按钮

问题描述 投票:0回答:1

`我想自动化网络抓取。但是,我无法单击按钮来解析带有扩展 Buster 的 ReCAPTCHA。该按钮是#shadow-root(关闭)。

Button to resolve ReCAPTCHA

`from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.remote.webelement import WebElement
from bs4 import BeautifulSoup
import pandas as pd
import re
from time import sleep

def setup_driver():
    options = webdriver.FirefoxOptions()
    driver = webdriver.Firefox(options=options)
    extension_path = "/home/work04/.mozilla/firefox/vyrx65nr.default-release/extensions/{e58d3966-3d76-4cd9-8552-1582fbc800c1}.xpi"
    driver.install_addon(extension_path, temporary=True)
    driver.maximize_window()
    driver.implicitly_wait(10)

    return driver

def recaptcha(driver):
   wait = WebDriverWait(driver, 10)

   try:
       wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.button-holder:nth-child(4)')))
       shadow_host = driver.find_element(By.CLASS_NAME, 'button-holder help-button-holder')
       shadow_element = driver.execute_script('return arguments[0].shadowRoot.querySelector("#solver-button")', shadow_host)
       shadow_root = shadow_element.shadow_root
       reCAPTCHA_button = shadow_root.find_element(By.CSS_SELECTOR, '#solver-button')

       if reCAPTCHA_button.is_displayed():
          reCAPTCHA_button.click()
          print("Botão reCAPTCHA clicado com sucesso!")
       else:
          print("O botão reCAPTCHA não está visível na página.")

   except NoSuchElementException as erro:
      print(f"Erro: {erro}")
      print("O elemento do reCAPTCHA não foi encontrado na página, continuando sem resolver.")

  except Exception as e:
     print(f"Ocorreu um erro inesperado: {e}")`

我该如何做到这一点?

python selenium-webdriver web-scraping firefox-addon firefox-addon-webextensions
1个回答
0
投票

您定位影子根的方法仅适用于 Chrome。如果您使用 FF,您可以尝试以下操作:

[...]
wait = WebDriverWait(browser, 20)
[..]
parent_div = wait.until(EC.presence_of_element_located((By.XPATH, '//div[@class="button-holder help-button-holder"]'))) 
shadowRoot = driver.execute_script("return arguments[0].shadowRoot", parent_div)
button = WebDriverWait(shadowRoot, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[id='solver-button']"))) 
button.click()

查看 Selenium 文档 了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.