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,提问作者양원민
相关产品推荐
相关产品推荐

