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

Posted

技术标签:

【中文标题】迭代所有“选择”元素并在 Selenium 中获取它们的所有值【英文标题】:Iterate all 'select' elements and get all their values in Selenium 【发布时间】:2012-03-10 03:17:49 【问题描述】:

我在 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”。

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

【问题讨论】:

【参考方案1】:

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

在您的代码中:

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

计算该类型的表达式:

//select[position() =$someIndex]

这是:

的同义词
//select[$someIndex]

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

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

//select[$k]

$k 为整数时,表示:

选择文档中所有 $k-th select 子元素的 select 元素。”

i == 1 有效,但当i &gt; 1 方法返回null ("ERROR: 元素 //select[2] not found")。它仅在 i == 1 时有效。

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

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

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

改变

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

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

【讨论】:

感谢您回答我的问题。我已经在 J​​avascript 和 selenium 中尝试过你的代码。在添加括号后的 Javascritp 中,这可以正常工作,但在 selenium 中我仍然收到异常“错误:未找到元素 (//select)[2]”。 @Darxis:这意味着 Selenium 不是兼容的 XPath 1.0 实现。我强烈建议 not 使用任何不兼容的 XPath 引擎。我不知道 Selenium,但如果您可以先选择类似 XmlNode 的对象数组中的所有 select 元素(//select)。那么你可以只处理这个数组的每一项。 Selenium XPath 1.0 兼容,像(//select)[2] 这样的选择器工作得很好。问题一定是别的。但由于该页面的 html 尚未提供给我们,因此无法确定问题所在。 @RossPatterson:谢谢。我猜 OP 没有与我们分享一些重要信息。【参考方案2】:

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

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

这些

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

【讨论】:

【参考方案3】:

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

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

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

here 是我阅读的链接。

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

问候。

【讨论】:

以上是关于迭代所有“选择”元素并在 Selenium 中获取它们的所有值的主要内容,如果未能解决你的问题,请参考以下文章

使用 Selenium 和 Robot Framework 遍历 Web 元素

当元素为 data-testid 时如何处理弹出“接受所有 cookie” - 在 Python 中使用 Selenium

获取 Selenium 中选定元素的所有 CSS 属性的值

如何从 Selenium IDE 中的“链接”元素获取 url

Selenium Python:选择一个类中的所有项目并将它们放入列表中?

如何在 Selenium WebDriver 中获取“ul”类的所有“li”元素