2009-09-09 2 views
9

Я использую Selenium RC, и я хотел бы, например, чтобы получить все ссылки элементов с атрибутом HREF, которые соответствуют:Как использовать регулярное выражение в селене локаторы

http://[^/]*\d+com 

Я хотел бы использовать:

sel.get_attribute('//a[regx:match(@href, "http://[^/]*\d+.com")]/@name') 

, который вернет список атрибутов имени всех ссылок, соответствующих регулярному выражению. (или что-то вроде этого)

благодарит

+0

Так что же не работает и каким образом он не работает? Можете ли вы разместить HTML (или его фрагмент), с которым вы согласны? –

+0

@Paul, данный пример и метод get_attribute() возвращает только один элемент, а не список. Плакат спрашивает, что эквивалентно для возврата списка атрибутов, например. – David

ответ

3

Вы можете использовать команду Селен getAllLinks, чтобы получить массив идентификаторов ссылок на страницы, которые вы могли бы затем Переберите и проверить HREF с помощью GetAttribute, который берет локатор, за которым следуют @ и имя атрибута. Например, в Java, это может быть:

String[] allLinks = session().getAllLinks(); 
List<String> matchingLinks = new ArrayList<String>(); 

for (String linkId : allLinks) { 
    String linkHref = selenium.getAttribute("id=" + linkId + "@href"); 
    if (linkHref.matches("http://[^/]*\\d+.com")) { 
     matchingLinks.add(link); 
    } 
} 
+0

Я не думаю, что это то, что он хотел - он хочет найти элемент с использованием регулярного выражения в качестве локатора (как часть XPATH). – olamundo

+0

В этом вопросе упоминаются ссылки на все *, которые соответствуют регулярному выражению. Поскольку Selenium не поддерживает это (насколько мне известно), получение всех ссылок со страницы, а затем использование вашего языка клиента для проверки местоположений против регулярного выражения является разумным решением. –

+0

Я отредактировал свой пример кода, чтобы выполнить регулярное выражение. Я не делал этого изначально, потому что он зависит от используемого языка клиента и хотел бы, чтобы ответ был простым. –

10

Ответ выше, вероятно, правильный путь, чтобы найти все ссылки, которые соответствуют регулярному выражению, но я думал, что это также может быть полезным, чтобы ответить на другой части вопрос, как использовать регулярное выражение в локаторах Xpath. Вы должны использовать регулярное выражение соответствует() функции, например:

xpath=//div[matches(@id,'che.*boxes')] 

(это, конечно, щелкнул бы DIV с Ид = флажков ', или 'ид = cheANYTHINGHEREboxes')

Be однако, что функция совпадений не поддерживается всеми встроенными реализациями браузера Xpath (наиболее очевидно, что использование этого в FF3 вызовет ошибку: недопустимый xpath [2]).

Если у вас возникли проблемы с вашим конкретным браузером (как и с FF3), попробуйте использовать разрешающую способность Selenium allowNativeXpath («false») для переключения на интерпретатор JavaScript Xpath. Это будет медленнее, но похоже, что он работает с большим количеством функций Xpath, включая 'matches' и 'ends-with'. :)

+0

как вы проверяете свой xpath? Обычно я использую добавление Firefox в xpath-checker. Но он не распознает регулярное выражение в xpath. – Guy

+0

Использование этого дополнения xpath-checker - отличная идея! Я никогда не думал искать его. У меня нет записи слишком много локаторов xpath. На моей работе я построил независимую от инструмента тестовую среду, которая строит локаторы для множества инструментов, включая Selenium, используя наш собственный простой синтаксис. Я только должен был изучить эти локаторы xpath достаточно хорошо, чтобы написать код, который мог бы их генерировать. :) –

+0

+1 для allowNaticeXPath (ложный) отзыв. Сэкономил мне много царапин прямо сейчас :) –

0

Вот несколько альтернативных методов для Selenium RC. Это не чистые решения Selenium, они позволяют взаимодействовать с вашими структурами данных языка программирования и Selenium.

Вы также можете получить источник HTML-страницы, а затем регулярное выражение источника, чтобы вернуть набор ссылок. Используйте группировку регулярных выражений, чтобы разделить URL-адреса, текст/ID ссылки и т. Д., И затем вы можете передать их обратно в селен, чтобы щелкнуть или перейти к.

Еще один способ - получить исходный HTML-файл или innerHTML (через локаторы DOM) родительского/корневого элемента, а затем преобразовать HTML в XML как объект DOM на ваш язык программирования. Затем вы можете пересечь DOM с помощью желаемого XPath (с регулярным выражением или нет) и получить узел узлов только интересующих ссылок. Из их разборьте текст/ID ссылки или URL, и вы можете вернуться к селену, чтобы щелкнуть или перейти к.

По запросу я приведу примеры ниже. Это смешанные языки, поскольку почта, по-видимому, не была языковой спецификой. Я просто использую то, что у меня было для взлома, для примера. Они не полностью протестированы или протестированы вообще, но я работал с битами кода раньше в других проектах, поэтому они являются доказательством примеров кода концепции того, как вы будете реализовывать решения, о которых я только что упомянул.

//Example of element attribute processing by page source and regex (in PHP) 
$pgSrc = $sel->getPageSource(); 
//simple hyperlink extraction via regex below, replace with better regex pattern as desired 
preg_match_all("/<a.+href=\"(.+)\"/",$pgSrc,$matches,PREG_PATTERN_ORDER); 
//$matches is a 2D array, $matches[0] is array of whole string matched, $matches[1] is array of what's in parenthesis 
//you either get an array of all matched link URL values in parenthesis capture group or an empty array 
$links = count($matches) >= 2 ? $matches[1] : array(); 
//now do as you wish, iterating over all link URLs 
//NOTE: these are URLs only, not actual hyperlink elements 

//Example of XML DOM parsing with Selenium RC (in Java) 
String locator = "id=someElement"; 
String htmlSrcSubset = sel.getEval("this.browserbot.findElement(\""+locator+"\").innerHTML"); 
//using JSoup XML parser library for Java, see jsoup.org 
Document doc = Jsoup.parse(htmlSrcSubset); 
/* once you have this document object, can then manipulate & traverse 
it as an XML/HTML node tree. I'm not going to go into details on this 
as you'd need to know XML DOM traversal and XPath (not just for finding locators). 
But this tutorial URL will give you some ideas: 

http://jsoup.org/cookbook/extracting-data/dom-navigation 

the example there seems to indicate first getting the element/node defined 
by content tag within the "document" or source, then from there get all 
hyperlink elements/nodes and then traverse that as a list/array, doing 
whatever you want with an object oriented approach for each element in 
the array. Each element is an XML node with properties. If you study it, 
you'd find this approach gives you the power/access that WebDriver/Selenium 2 
now gives you with WebElements but the example here is what you can do in 
Selenium RC to get similar WebElement kind of capability 
*/ 
+0

Где они? («Вот несколько альтернативных методов ...»), пожалуйста, дайте более явные примеры кода. –

+0

Хорошо, я обновляю ответ с помощью фактического примера или ссылки на один, когда у меня появится шанс (может быть, через несколько дней или недель, вроде бы занят сейчас). – David

+0

Это было бы очень признательно. Спасибо. –