1

使用 selenium 我想获取项目的顺序,或者更确切地说是多选列表或下拉列表的键列表。在 selenium API 中看到我们可以获取所选项目的索引,但我想获取所有项目的索引或键。可能吗?如果还那么怎么办?或者,如果我可以获得列表中的项目索引和值,那也应该没问题。或者无论如何要为列表框/多选列表一次获取所有键或值?

实际上,我想验证给定项目的顺序是否正确。

(事实上​​,我想提供一个固定装置来验证给定项目是否有序。例如,列表框包含 A、B、C、D、E 并且有人使用 (new String("A,B,c, D,E"),dropDownLocator) 那么它应该返回 true,否则返回 false。)

4

2 回答 2

5

@9ikhan 的答案对于获取属性是正确的,但我认为值得一提的是该答案的一个警告,如果实际上您正在寻找元素内容而不是属性值,则提供更直接的解决方案,正如您所建议的那样。

第 1 点:获取属性的语法。

定位器"//some-xpath-here/@attribute-name"是标准 XPath 的正确语法,但是当涉及到属性时, Selenium 不使用标准 XPath!相反,它使用了这一点——注意删除了最后的 virgule:(正如@Wesley Wiser 在我的问题Complications with Selenium's GetAttribute method"//some-xpath-here@attribute-name"中最初向我指出的那样)。标准 XPath 语法可能会在某些特殊情况下起作用——例如这个例子 :-)——但通常请注意,您需要使用 Selenium 语法。

第 2 点:获取元素内容而不是属性。

这是我的相同代码版本。首先,我修改后的 HTML 清楚地描述了内容中的属性值:

<html>
  <body>
    <select id ="bakedgoods">
     <option value="1">cookie</option>
     <option value="2">donut</option>
     <option value="3">muffin</option>
    </select>
  </body>
</html>

我的代码片段恰好在 C# 中,但它实际上与前面的 Java 示例相同。请注意,我展示了两种变体——一种用于属性,一种用于内容,因此您可以取消注释要测试的一种。

var optionCount = (int) selenium.GetXpathCount("//select[@id='bakedgoods']/option");
var optionList = new List<String>();
for (int i = 1; i <= optionCount; i++)
{
    // Get element content:
    // Returns: cookie, donut, muffin
    String option = selenium.GetText("//select[@id='bakedgoods']/option[" + i + "]");

    // Get attributes:
    // Returns: 1, 2, 3
    //String option = selenium.GetAttribute("//select[@id='bakedgoods']/option[" + i + "]@value");
    optionList.Add(option);
}

但是,如果您只想要内容,则存在一个更简单的解决方案:

// Get element content:
// Returns: cookie, donut, muffin
string[] items = selenium.GetSelectOptions("//select[@id='bakedgoods']");
于 2011-05-10T16:20:44.247 回答
1

如果你的 html 是这样的

<select id ="lang">
 <option value="en_US">en_US</option>
 <option value="en_GB">en_GB</option>
 <option value="en_IE">en_IE</option></select>

那么你可以使用这样的东西

int optionCount = selenium.getXpathCount("//select[@id='lang']/option").intValue();
        ArrayList<String> optionList = new ArrayList<String>();
        for (int i = 1; i <= optionCount; i++) {
            String option = selenium.getAttribute("//select[@id='lang']/option["+i+"]/@value");
            optionList.add(option);
        }

我在这里使用了 java,您的选项元素将在 中optionList,您可以将其与现有列表进行比较。此外,这不适用于标签。说<option value="en_US">English(U.S)</option>,无法从中检索英语(美国),但此代码适用于任何属性。

于 2011-05-09T16:20:06.053 回答