迭代所有'select'元素并在Selenium中获取所有值

时间:2012-02-19 14:25:30

标签: 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时,这可行,但是当我&gt; 1方法返回null(“ERROR:Element // select [2] not found”)。它仅在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”。

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

3 个答案:

答案 0 :(得分:4)

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

在您的代码中:

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

评估类型的表达式:

//select[position() =$someIndex]

是以下词的同义词:

//select[$someIndex]

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

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

//select[$k]

$k为整数时,表示:

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

  

i == 1有效时,但当i > 1方法返回null时(“错误:   元素//选择[2]未找到“)。仅当i == 1时才有效。

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

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

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

更改

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

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

答案 1 :(得分:1)

最后我找到了解决方案。 我刚刚更换了这些行

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

与这些

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

答案 2 :(得分:0)

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

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

与这些选择器一起,你可以组合使用很多东西。

here是我阅读的链接。

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

的问候。