单击影子根 Selenium Python 中的元素

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

我正在尝试使用 python Selenium 中的脚本与网页进行交互。 现在我找到了一个带有shadow-root的网站。在网上建立的,我尝试使用:

shadow_host1 = driver.find_element(By.CSS_SELECTOR, "[id ='bt-inner-page']")
shadow_root1 = driver.execute_script('return arguments[0].shadowRoot', shadow_host1)
elem = shadow_root1.find_element(By.CSS_SELECTOR, ".bt72 > svg:nth-child(1)")

elem是搜索按钮(见图,红框)。 网站是“https://www.tg.casino/en/sports”

我找不到 elem,目标是点击它。

实际上我使用 Firefox 作为浏览器,似乎可以访问影子根(我没有错误),但我无法定位元素(尝试使用 XPATH、CSS_SELECTOR、CLASS_SELECTOR)

python selenium-webdriver shadow-root
1个回答
0
投票

你不会等待 Shadow DOM 被渲染,所以当你的元素实际上处于部分渲染状态时,你就会遇到这个问题。

要等待渲染,您应该:

  • 等待影子主机可见
  • 找到它的内在根源
  • 等待元素在 Shadow DOM 中渲染

示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
timeout = 10
wait = WebDriverWait(driver, timeout)

def get_shadow_root(element):
    return driver.execute_script('return arguments[0].shadowRoot', element)

driver.get("https://www.tg.casino/en/sports")
driver.maximize_window()

shadow_host = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "[id='bt-inner-page']")))
shadow_container = get_shadow_root(shadow_host)
shadow_container_root = shadow_container.find_element(By.ID, 'bt-root')
elem = WebDriverWait(shadow_container_root, timeout).until(EC.presence_of_element_located((By.CSS_SELECTOR, '.bt72')))
elem.click()
© www.soinside.com 2019 - 2024. All rights reserved.