Переберите все элементы «select» и получите все их значения в Selenium - PullRequest
1 голос
/ 19 февраля 2012

У меня есть следующий код в C # с использованием селена:

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] not found»).Это работает только тогда, когда я == 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());

, которые печатают на экране "[объект Attr]", а затем "ноль"

Что я делаю не так?Моя цель состоит в том, чтобы перебрать все элементы «select» на странице, найти элемент с указанной меткой и выбрать его.

Ответы [ 3 ]

4 голосов
/ 19 февраля 2012

Это второй наиболее часто задаваемый вопрос в XPath (первое - это имена без префиксов и пространство имен по умолчанию .

В вашем коде:

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

Вычисляется выражение типа:

//select[position() =$someIndex]

который является синонимом для:

//select[$someIndex]

когда известно, что $someIndex имеет целочисленное значение.

Однако по определению псевдооператора // XPath,

//select[$k]

, когда $k является целым числом, означает:

" Выбрать все select элементы в документе, которые являются $k -ым select дочерним элементом их родителя ."

Когда i == 1 это работает, но когда i > 1, метод возвращает null ("ОШИБКА: Элемент // select [2] not found "). Работает только при i == 1.

Это просто означает, что в документе XML нет элемента, который имеет более одного select дочернего элемента.

Это правило, которое нужно помнить : оператор [] XPath имеет более высокий приоритет (приоритет), чем псевдо-оператор //.

Решение : Как всегда, когда нам нужно переопределить приоритет операторов по умолчанию, мы должны использовать скобки.

Изменение

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

до

options = selenium.GetSelectOptions("(//select)["+i+"]");   
1 голос
/ 20 февраля 2012

Наконец-то я нашел решение.Я только что заменил эти строки

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

на эти

options = selenium.GetSelectOptions("//descendant::select[" + i + "]");
selenium.Select("//descendant::select[" + i + "]", "label=" + label);
0 голосов
/ 20 февраля 2012

Приведенное выше решение options = selenium.GetSelectOptions("(//select)["+i+"]"); не работает для меня, но я попытался использовать селекторы CSS.

Я хочу получить текстовое поле для имени пользователя и пароля.Я попробовал с css=input, что дало мне текстовое поле Имя пользователя, а при использовании css=input+input это дало мне текстовое поле Пароль.

вместе с этими селекторами вы можете использовать многие вещи в комбинации.

здесь - это ссылка, с которой я прочитал.

Я думаю, это поможет вам достичь вашей цели.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...