You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Selenium中Shadow DOM元素点击失败的解决方法咨询

解决Selenium中Shadow DOM元素点击问题

问题分析

你的代码存在两个关键问题:

  • XPATH和CSS选择器里的"是HTML转义字符,需替换为正常引号
  • CSS选择器中的空格会被解析为后代元素选择器,但这里是同一个元素的多个类名,应该用.连接

修正后的代码

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

browser = webdriver.Chrome()
browser.get('https://ownist.kr/member/login.html')

# 用显式等待替代固定延时,提升稳定性
WebDriverWait(browser, 10).until(
    EC.presence_of_element_located((By.XPATH, '/html/body/iframe[3]'))
)
iframe = browser.find_element(By.XPATH, '/html/body/iframe[3]')
browser.switch_to.frame(iframe)

def expand_shadow_element(element):
    return browser.execute_script('return arguments[0].shadowRoot', element)

# 修正转义引号,获取Shadow根节点
shadow_section = expand_shadow_element(browser.find_element(By.XPATH, '//*[@id="ch-shadow-root-wrapper"]'))
# 修正CSS选择器:同一个元素的多个类名用.连接
close_btn = shadow_section.find_element(By.CSS_SELECTOR, '.PopupCloseBtn__CloseButton-ch-front__sc-14jjsiy-1.fOmWsj')
close_btn.click()

# 操作完成后切回主文档(按需使用)
browser.switch_to.default_content()

额外优化建议

  • 避免使用绝对XPATH(如/html/body/iframe[3]),可通过元素的class、name等属性定位,比如用By.CSS_SELECTOR匹配带有特定标识的iframe
  • 始终优先使用WebDriverWait显式等待,替代固定时长的time.sleep,减少因页面加载慢导致的元素定位失败

内容的提问来源于stack exchange,提问作者양원민

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 05:50:59