我正在尝试为 <table>
重用找到的 WebElement下面搜索其后代和直接后代:
<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
来引用当前元素。
这个伪类存在于 Selectors Level 4 specification 中目前受 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"));
请注意,使用像“直接子代”这样的强依赖项通常会导致选择器脆弱,这会增加测试的维护成本。
关于c# - 如何在 Selenium 中使用 CSS 选择器查找非根元素的直接后代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47093744/