Python Selenium如何基于aria-label等自定义属性定位点击Shadow DOM中的元素
自定义标签Shadow DOM元素定位点击方案
你原来的CSS选择器定位逻辑是完全可行的,点击失败的核心原因是目标元素自带disabled属性与pointer-events: none样式,浏览器默认拦截了该元素的所有点击事件,需要先解除限制再执行点击操作。
方案1:保留原有定位逻辑,先解除点击限制再操作
from selenium.webdriver.common.by import By # 原有定位逻辑正确,建议替换为Selenium新版推荐的By类写法 button = shadow_root4.find_element(By.CSS_SELECTOR, 'com-calendar-date[date="2021-09-28"]') # 移除所有阻止点击的属性与样式 driver.execute_script(""" arguments[0].removeAttribute('disabled'); arguments[0].removeAttribute('aria-disabled'); arguments[0].style.pointerEvents = 'auto'; """, button) # 执行点击,可选择原生点击或JS点击 button.click() # driver.execute_script("arguments[0].click();", button)
方案2:遍历匹配自定义标签属性,兼容特殊场景
如果Shadow DOM下CSS属性选择器存在兼容问题,可以先获取所有同标签元素,再遍历匹配date属性:
from selenium.webdriver.common.by import By all_date_eles = shadow_root4.find_elements(By.TAG_NAME, 'com-calendar-date') target_date = "2021-09-28" for ele in all_date_eles: if ele.get_attribute("date") == target_date: driver.execute_script(""" arguments[0].removeAttribute('disabled'); arguments[0].style.pointerEvents = 'auto'; arguments[0].click(); """, ele) break
注意事项
如果目标日期属于组件逻辑上禁止选择的范围(比如已过期日期、未开放预约日期),强制点击后需要验证后续业务流程是否符合预期,避免强制操作带来的业务异常。
内容的提问来源于stack exchange,提问作者Mark Sanchez
相关产品推荐
相关产品推荐

