shadow-root中的元素定位方法

本文介绍了一种特殊的DOM结构——shadow-root,并提供了在这种结构下定位元素的具体步骤和方法,包括使用JavaScript进行定位及利用浏览器自带的功能简化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

最近接手了一个新项目的测试工作,前几天领导让做自动化,本来以为平平无奇的自动化,结果开始写的时候就给我难住了,明明白白的看见元素就在页面上,用了css、xpath等各种定位方法,却怎么都定位不到,搞得我差点怀疑自己之前学的定位方法都是假的。
直到我师父给我点拨,说shadow-root里面的元素不能用普通的定位方法,才指引我走上正确的道路。

观察一下元素的DOM结构

这是我当时要定位的元素,可以看到,元素在shadow-root里面
在这里插入图片描述

我理解的shadow-root

到底什么是shadow-root我也不能说的很清楚,但是我大概的理解就是它是DOM中的DOM
我们用css或者xpath之所以能定位到元素,是因为元素在DOM结构中,而shadow-root像是在DOM的某个元素里面包了一层DOM,你必须进入这个元素,然后进入shadow-root,才能拿到它里面的元素

定位步骤

根据自己的理解和网上查询资料发现定位shadow-root里面的元素大致步骤都是这样的:

  1. 先定位到shadow-root节点的父节点,在这里就是 toolkit-bar
  2. 然后进入shadow-root节点
  3. 之后就可以对shadow-root里面的元素进行定位了

实现元素定位的语句

我这里用js语句定位的,按上述说的步骤来,这里就完美的定位到了
然后在你的自动化代码中执行这条js语句就可以了,document.getElementsByTagName(“toolkit-bar”)[0].shadowRoot.querySelector(".import")
tip: 我在puppeteer中调用这条js语句拿不到返回值,尝试了几次发现是因为语句中有shadowRoot,所以建议大家如果要对这个元素做什么操作,直接在js语句里面操作吧
在这里插入图片描述

还有一种更简单的方法

emm…还有一种更简单的方法,直接在元素上右击,选择copy,copy里面有很多定位方式,如下图所示,由于右击之后截不了图,所以用手机拍的照片,有点不清晰,凑合看吧~~~~
其实我觉得有时候实在定位不到的话可以这么用,就像这个问题,完全是因为我没有遇到过shadow-root,所以不知道这个元素定位不到是因为在shadow-root里面,但如果当时我能尝试用浏览器自带的copy去尝试一下,最起码拿到定位的语句会去研究一下shadow-root相关,不至于无从下手。
在这里插入图片描述

在Python中,特别是在Web自动化测试或使用Selenium库时,定位Shadow DOM(阴影根)下的元素可能会有些复杂,因为Shadow DOM是一种CSS隔离技术,用于封装HTML元素和其样式。要在Shadow DOM中定位元素,你需要采取以下几个步骤: 1. 导入所需库:首先确保已经安装了selenium、webdriver_manager以及可能需要的如pyside2等UI自动化工具。 ```python 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 ``` 2. 设置浏览器和driver:创建一个支持Shadow DOM功能的WebDriver实例,例如Firefox with FirefoxDriver or Chrome with ChromeDriver。 3. 使用显式等待(`WebDriverWait`):由于Shadow DOM中的元素默认不可见,需要等待元素变为可用状态。这通常通过`element_to_be_clickable()`等预期条件函数完成。 ```python wait = WebDriverWait(driver, timeout=10) element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '[some-shadow-selector]'))) ``` 4. 使用 ShadowRoot API:Selenium的`execute_script`方法可以让你直接操作浏览器的JavaScript环境。你可以使用这个方法找到Shadow DOM元素。 ```python # 获取元素所在的ShadowRoot shadow_root = driver.execute_script("return arguments[0].shadowRoot;", element) # 现在可以在shadow_root里查找元素 shadow_element = shadow_root.find_element(by=By.TAG_NAME, value='desired-element') ``` 5. 完成操作:现在你可以像平常一样对`shadow_element`进行操作,比如点击、输入文本等。 请注意,Shadow DOM的结构可能因网页的具体实现而变化,因此在编写代码时,需要准确匹配选择器或使用更具体的属性来定位元素
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值