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

标签 c# css selenium

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

相关文章:

javascript - 带有汉堡图标的响应式侧面导航菜单

python - 已安装 Html 测试运行程序,但显示错误 "ModuleNotFoundError: No module named ' HtmlTestRunner' "

selenium - href 元素的 Xpath

c# - 使用 ADO.NET (OleDb) 创建 Excel 工作表 --> 支持哪些数据类型?

c# - 我收到这个错误。无法将类型 'double' 隐式转换为 'decimal' 。存在明确的对话(您是否缺少类型转换?)

css - 如何将 Angular $animate 与动态计算的变化的 css 样式一起使用

c# - 在 C# 中的 MSTest TestCleanup 中获取 TestResult

c# - 无法从 'string' 转换为 'System.Net.Http.HttpRequestMessage'

c# - 实现文件上传的 MVP 模式

html - 如何使用 rowspan 为每个交替行着色?