c# - 迭代所有 'select' 元素并在 Selenium 中获取它们的所有值

标签 c# javascript select xpath selenium

我在 C# 中使用 selenium 编写了以下代码:

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 时,此方法有效,但当 i > 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());

在屏幕上打印“[object Attr]”然后打印“null”。

我做错了什么? 我的目标是遍历页面上的所有“选择”元素并找到具有指定标签的元素并选择它。

最佳答案

这是 XPath 中第二多的 FAQ(第一个是无前缀名称和默认命名空间)。

在您的代码中:

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

评估类型的表达式:

//select[position() =$someIndex]

这是以下的同义词:

//select[$someIndex]

当已知 $someIndex 有一个整数值时。

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

//select[$k]

$k为整数时,表示:

"选择文档中所有 select 元素,它们是其父元素的 $k-th select 子元素。”

When i == 1 this works, but when i > 1 the method return null ("ERROR: Element //select[2] not found"). It works only when i == 1.

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

这是一个需要记住的规则:[] XPath 运算符比// 伪运算符具有更高的优先级(优先级)。

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

改变:

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

:

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

关于c# - 迭代所有 'select' 元素并在 Selenium 中获取它们的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9350012/

相关文章:

php - 从 MySql 返回小于 60 天的行

windows - 选择对象,不同的输出

c# - 如何确定一首歌曲使用了 winmm.dll 多长时间?

c# UWP 自动滚动文本

javascript - Ajax 错误 504 - SQL 存储过程保存和返回记录

javascript - 传递成员时在 JavaScript 中丢失 "this"上下文

c# - 磁贴在 WP8.1 Silverlight 应用程序中未正确显示

c# - WPF - MediaElements 不显示多个 H.265 视频

javascript - 签名过程完成后,在 docusignapi 中返回签名文档或签名文档的链接

MySQL:在数据库中查找活跃客户的查询