gpt4 book ai didi

c# - 如何在 Selenium 中使用 CSS 选择器查找非根元素的直接后代?

转载 作者:行者123 更新时间:2023-12-02 20:36:07 24 4
gpt4 key购买 nike

我正在尝试为 <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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com