迭代所有“选择”元素并在Selenium中获取它们的所有值

本文关键字:获取 Selenium 选择 元素 迭代 | 更新日期: 2023-09-27 18:25:10

我在C#中使用硒有以下代码:

private void SelectElementFromList(string label)
    {
        var xpathcount = selenium.GetXpathCount("//select");
        for (int i = 1; i <= xpathcount; ++i)
        {
            string[] options;
            try
            {
                options = selenium.GetSelectOptions("//select["+i+"]");
            }
            catch
            {
                continue;
            }
            foreach (string option in options)
            {
                if (option == label)
                {
                    selenium.Select("//select[" + i + "]", "label=" + label);
                    return;
                }
            }
        }
    }

问题是这行:

options = selenium.GetSelectOptions("//select["+i+"]");

当 i == 1 时,这有效,但是当我> 1 时,该方法返回 null("错误:未找到元素//select[2]"(。它仅在 i == 1 时才有效。

我也在 JS 中尝试过这段代码:

var element = document.evaluate("//select[1]/option[1]/@value", document, null, XPathResult.ANY_TYPE, null);
alert(element.iterateNext());
var element = document.evaluate("//select[2]/option[1]/@value", document, null, XPathResult.ANY_TYPE, null);
alert(element.iterateNext());

哪个在屏幕上打印"[对象 Attr]",然后打印"null"。

我做错了什么?我的目标是迭代页面上的所有"选择"元素,找到具有指定标签的元素并选择它。

迭代所有“选择”元素并在Selenium中获取它们的所有值

这是 XPath 中第二多的常见问题解答(第一个是无前缀名称和默认命名空间

在您的代码中:

options = selenium.GetSelectOptions("//select["+i+"]"); 

计算该类型的表达式:

//select[position() =$someIndex]

这是以下的同义词:

//select[$someIndex]

当已知$someIndex具有整数值时。

但是,根据 // XPath 伪运算符的定义,

//select[$k]

$k为整数时,表示:

">选择文档中所有select元素,这些元素是其父级的第$k select子元素。">

i == 1这有效时,但是当i > 1该方法返回null("错误: 元素//select[2] 未找到"(。它仅在 i == 1 时才有效。

这仅意味着在 XML 文档中没有具有多个select子元素。

这是要记住的规则[] XPath 运算符的优先级(优先级(高于伪运算符//

解决方案:与往常一样,当我们需要覆盖运算符的默认优先级时,我们必须使用括号。

更改

options = selenium.GetSelectOptions("//select["+i+"]");               

options = selenium.GetSelectOptions("(//select)["+i+"]");   

终于我找到了解决方案。我刚刚替换了这些行

options = selenium.GetSelectOptions("//select["+i+"]");
selenium.Select("//select["+i+"]", "label="+label);

有了这些

options = selenium.GetSelectOptions("//descendant::select[" + i + "]");
selenium.Select("//descendant::select[" + i + "]", "label=" + label);

上述解决方案options = selenium.GetSelectOptions("(//select)["+i+"]");对我不起作用,但我尝试使用 css 选择器。

我想获取用户名和密码文本框。我尝试了css=input这给了我用户名文本框,当使用时css=input+input这给了我密码文本框。

除了这个选择器,您还可以组合使用许多东西。

这是我阅读的链接。

我认为这将有助于您实现目标。

问候。