我正在尝试重用找到的 WebElement<table>
下面来搜索它的后代和直系后代:
<html>
...
<table id="tbl">
<tbody>
<tr>
<td>
<div>foo</div>
</td>
</tr>
...
<tr><td><button class="btnDefault"/></td></tr>
</tbody>
</table>
...
</html>
该表可能包含嵌套表 - 也可能不包含,我只是不想费力地完成整个事情,我宁愿使用一个更具体的选择器来保证做我想做的事情。我需要的一些元素没有合理的 ID,我想使用选择器查找它们:
#tbl1 > tbody > tr:first-child > td:first-child > div
#tbl1 > tbody > tr > td > button.btnDefault
为了使代码更少重复并且更快,我想缓存<table>
元素:
var table = driver.FindElement(By.Id("tbl"));
var div = table.FindElement(By.CssSelector("> tbody > tr:first-child > td:first-child > div"));
var button = table.FindElement(By.CssSelector("> tbody > tr > td > button.btnDefault"));
这会因为第二个和第三个查询上的 CSS 选择器无效而爆炸。这是正确的,但话又说回来,标准 CSS 语法并不意味着从特定范围进行搜索。是否有某种结构可以用作此处查询的根?
一种选择是使用伪类:scope
引用当前元素。
这个伪类存在于选择器 4 级规范 https://www.w3.org/TR/selectors4/#the-scope-pseudo目前 Firefox 和 Chrome 均支持。但有些浏览器可能不支持。
var table = driver.FindElement(By.Id("tbl"));
var div = table.FindElement(By.CssSelector(":scope > tbody > tr:first-child > td:first-child > div"));
var button = table.FindElement(By.CssSelector(":scope > tbody > tr > td > button.btnDefault"));
请注意,使用“直接子级”等强依赖项通常会导致选择器脆弱,这会增加测试的维护成本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)