Selenium: Как мне выполнить функцию или выражение Xpath в моем тесте? - PullRequest
3 голосов
/ 17 февраля 2009

Есть ли способ выполнить код Xpath в тесте Selenium? Я знаю, что вы можете выполнить javascript, но я ищу способ выполнить некоторый код Xpath, помимо простого нахождения элемента на странице.

Кто-нибудь сталкивался с этим?

Ответы [ 5 ]

2 голосов
/ 05 марта 2009

Насколько я понимаю, функции XPath являются частью XPath 2.0. Селен не поддерживает 2.0. Таким образом, выполнение функций XPath в селене невозможно.

1 голос
/ 10 апреля 2012

Я считаю, что принятый ответ неверен. В настоящее время я изучаю Selenium WebDriver с Java, и меня направили в следующий пост в блоге, чтобы узнать, как выполнять функции XPath в Selenium 2 для управления переменными xpath. Я считаю, что это то, что вы ищете.

http://automationtricks.blogspot.com/2010/09/how-to-use-functions-in-xpath-in.html

0 голосов
/ 01 октября 2009

Взгляните на строку 1177 файла htmlutils.js в выпуске Selenium версии 1.0.1 (это внутри функции eval_xpath (), которая обрабатывает все запросы XPath):

    var result = xpathResult.iterateNext();

Проблема здесь заключается в том, что согласно спецификации XPathResult , iterateNext () сгенерирует исключение, если тип результата не является итеративным набором узлов. Поскольку Selenium вслепую предполагает, что все запросы XPath приводят к набору узлов, вы не можете выполнить запрос, который возвращает число или строку.

Что вы можете сделать, это изменить htmlutils.js, заменив строки 1177-1181 на что-то вроде следующего:

    var iterable =
     xpathResult.resultType == xpathResult.ORDERED_NODE_ITERATOR_TYPE ||
     xpathResult.resultType == xpathResult.UNORDERED_NODE_ITERATOR_TYPE;

    if (iterable) {
     var result = xpathResult.iterateNext();
     while (result) {
         results.push(result);
         result = xpathResult.iterateNext();
     }
    } else if (xpathResult.resultType == xpathResult.NUMBER_TYPE) {
     results.push(inDocument.createTextNode(xpathResult.numberValue));
    }

Идея состоит в том, что если мы увидим числовое значение, мы обернем его внутри текстового узла DOM и передадим его, как обычно, изменение, которое более или менее прозрачно для Selenium. Команда getText в Selenium имеет специальную обработку для TextNodes (она возвращает их текстовое содержимое в виде строки), так что теперь вы можете сделать что-то вроде

int count = Integer.parseInt(selenium.getText("xpath=count(//td) + 1"), 10);

, где selenium - это экземпляр DefaultSelenium, если вы используете Java-клиент SeleniumRC, как и я. Конечно, это тривиальный пример, так как вы могли бы просто использовать getXpathCount () и другие типы XPathResult для обработки, но это должно помочь вам начать правильный путь.

Также обратите внимание, что конкретные строки, упомянутые выше, предназначены только для выполнения запросов XPath в браузере. Выполнение с использованием встроенной библиотеки XPath Selenium обрабатывается сразу же после eval_xpath () и, вероятно, потребует аналогичных изменений - но я еще не рассматривал это.

0 голосов
/ 26 марта 2009

Согласно спецификации W3C XPath 1.0, в XPath 1.0 есть поддержка функций, но с довольно ограниченным набором доступных функций: http://www.w3.org/TR/xpath#section-String-Functions

В частности, функция "заканчивается" недоступна - я использую выражения типа

//input[substring(@id, string-length(@id) - string-length('<idSuffix>') +1) = '<idSuffix>']

в качестве обходного пути (в данном случае для поиска элемента ввода с идентификатором, оканчивающимся на '<idSuffix>').

0 голосов
/ 17 февраля 2009

Эндрю, Интересный вопрос Возможно, вы захотите посетить форум разработчиков Selenium или форум Advanced Usage, поскольку я, пожалуй, единственный разработчик Selenium, который сейчас работает в StackOverflow:)

Тем не менее, я уверен, что вы можете сделать это, но я не могу получить вам код прямо сейчас (на ноутбуке, у которого нет источника Selenium). Для этого потребуется получить указатель на «бот браузера» (см. Примеры запуска произвольного кода JS, как это сделать). Оттуда может быть вызов функции (или, вероятно, цепочка вызовов), которая может дать вам то, что вы хотите: вызов абстракции Selenium XPath.

Или, если у вас все в порядке с поддержкой только Firefox, просто найдите код JS для выполнения запросов Firefox XPath и вызовите его. Это довольно легко встроить в команду типа storeEval. Кроме того, помните, что Selenium внедряет библиотеку XPath вместе с библиотекой Selenium JS. Вы могли бы также позвонить напрямую. Вы не получите ярлыки и абстракции, которые Selenium предоставляет для некоторых простых выражений XPath, но я уверен, что это сработает.

Можете ли вы поделиться тем, что вы пытаетесь сделать? Обычно это происходит, когда я пытаюсь получить атрибут или текстовое значение из элемента.

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