С селена получить порядок элементов в раскрывающемся или множественном списке - PullRequest
1 голос
/ 09 мая 2011

Используя селен, я хочу получить порядок элементов или, вернее, список ключей из списка множественного выбора или раскрывающегося списка. Видя в Selen API, я вижу, что мы можем получить индекс выбранных элементов, но я хочу получить индекс или ключи всех элементов. Является ли это возможным? Если еще то как? Или, если я могу получить список элементов индекса и значение, которое также должно быть хорошо. Или в любом случае, чтобы получить все ключи или значения по одному для списка списка / множественного выбора?

На самом деле я хочу убедиться, что данные предметы находятся в правильном порядке.

(Infact Я хочу предоставить прибор, чтобы убедиться, что данные элементы в порядке. Скажем, например, список содержит A, B, C, D, E и кто-то вызывает этот API с помощью (новая строка («A, B, c, D, E»), dropDownLocator), тогда он должен возвращать true, иначе false.)

Ответы [ 2 ]

5 голосов
/ 10 мая 2011

Ответ от @ 9ikhan является правильным для получения атрибутов, но я думаю, что стоит упомянуть одно предостережение с этим ответом, плюс предоставление более простого решения, если, на самом деле, вы ищете содержимое элемента, а не значения атрибута, так каквы предлагаете.

Точка 1: Синтаксис для получения атрибута.

Локатор "//some-xpath-here/@attribute-name" является правильным синтаксисом для стандартного XPath, но , когда дело доходит до атрибутов Selenium не использует стандартный XPath!Скорее, он использует это - обратите внимание на удаление окончательного virgule: "//some-xpath-here@attribute-name" (как первоначально указал мне Уэсли Вайзер в моем вопросе Осложнения с помощью метода GetAttribute Selenium ).Могут быть некоторые специфические случаи, когда стандартный синтаксис 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']");
1 голос
/ 09 мая 2011

если ваш 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>, не удалось получить из него английский (U.S), но этот код будет работать для любого атрибута.

...