Взгляните на строку 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 () и, вероятно, потребует аналогичных изменений - но я еще не рассматривал это.