2009-09-09 8 views
9

Używam selen RC i chciałbym, na przykład, aby uzyskać wszystkie elementy powiązania z atrybutu href tym meczu:Jak używać regex w lokalizatory selenu

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

chciałbym używać:

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

która zwróci listę atrybutów nazwy wszystkich linków pasujących do wyrażenia regularnego. (lub coś podobnego)

dzięki

+0

Co nie działa, a w jaki sposób nie działa? Czy możesz opublikować kod HTML (lub jego fragment), z którym pasujesz? –

+0

@Paul, dany przykład i metoda get_attribute() zwraca tylko jeden element, a nie listę. Plakat pyta, jaki jest ekwiwalent zwrotu listy atrybutów, na przykład. – David

Odpowiedz

3

Można użyć getAllLinks poleceń selen, aby uzyskać tablicę identyfikatorów linków na stronie, które może następnie sprawdzić href używając getAttribute pętli i, która pobiera lokalizator, po którym następuje znak @ i nazwa atrybutu. Na przykład w Javie może to być:

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

Nie sądzę, że tego właśnie chciał - chce znaleźć element za pomocą wyrażenia regularnego jako lokalizatora (jako część XPATH). – olamundo

+0

Pytanie wspomina o łączeniu * wszystkich * linków pasujących do wyrażenia regularnego. Ponieważ Selenium nie obsługuje tego (zgodnie z moją wiedzą), uzyskanie wszystkich linków ze strony, a następnie używanie języka klienta w celu sprawdzenia lokalizacji względem wyrażenia regularnego, jest rozsądnym rozwiązaniem. –

+0

Edytowałem mój przykładowy kod, aby wykonać dopasowanie wyrażenia regularnego. Nie zrobiłem tego pierwotnie, ponieważ zależy to od używanego języka klienta i chciałem, aby odpowiedź była prosta. –

10

Odpowiedź powyżej to chyba dobry sposób, żeby znaleźć wszystkie linki pasujących regex, ale myślałem, że to będzie również pomocny odpowiedzieć na drugą część pytanie, jak korzystać z regex w lokalizatorach Xpath. Trzeba użyć regex mecze() funkcji, takich jak to:

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

(w tym, oczywiście, byłoby kliknij div z 'id = wyboru' lub 'id = cheANYTHINGHEREboxes')

Be świadomy jednak, że funkcja dopasowywania nie jest obsługiwana przez wszystkie natywne implementacje przeglądarki Xpath (najbardziej rzucające się w oczy, użycie tego w FF3 spowoduje błąd: invalid xpath [2]).

Jeśli masz problemy z określoną przeglądarką (tak jak zrobiłem to z FF3), spróbuj użyć opcji allowNativeXpath Selenium ("false"), aby przełączyć się na interpreter JavaScript Xpath. Będzie wolniej, ale wydaje się działać z większą liczbą funkcji Xpath, w tym "mecze" i "końce z". :)

+0

Jak sprawdzić swoją ścieżkę xpath? Zwykle używam dodatku firefox na xpath-checker. Ale nie rozpoznaje wyrażeń regularnych w ścieżce xpath. – Guy

+0

Korzystanie z tego dodatku do sprawdzania ścieżek xpath jest świetnym pomysłem! Nigdy nie myślałem, że go szukam. Nie mam jednak napisać zbyt wielu lokalizatorów xpath. W mojej pracy zbudowałem niezależną od narzędzi strukturę testową, która buduje lokalizatory dla wielu narzędzi, w tym Selenium, używając naszej własnej, prostej składni. Musiałem tylko nauczyć się tych lokalizatorów xpath na tyle dobrze, aby napisać kod, który mógłby je wygenerować. :) –

+0

+1 dla wskazówki allowNaticeXPath (false). Zaoszczędziłam teraz dużo drapania głowy :) –

0

Oto niektóre alternatywne metody również dla Selenium RC. Nie są to czyste rozwiązania Selenium, pozwalają na interakcję ze strukturami danych języka programowania i Selenium.

Możesz również uzyskać źródło strony HTML, a następnie wyrażenie regularne źródło, aby zwrócić zestaw dopasowanych linków. Użyj grupowania regex, aby odseparować adresy URL, tekst/identyfikator łącza itp., A następnie możesz przekazać je z powrotem do selenu, do którego można kliknąć lub nawigować.

Inną metodą jest pobranie źródła strony HTML lub innerHTML (za pomocą lokalizatorów DOM) elementu nadrzędnego/root, a następnie przekonwertowanie HTML na XML jako obiekt DOM w swoim języku programowania. Następnie możesz przemieścić DOM z żądaną ścieżką XPath (z wyrażeniem regularnym lub nie) i uzyskać zestaw węzłów tylko z interesującymi cię odsyłaczami. Po przeanalizowaniu tekstu/identyfikatora łącza lub adresu URL możesz wrócić do selenu, aby go kliknąć lub przejść do niego.

Na żądanie poniżej zamieszczam przykłady. Jest to język mieszany, ponieważ post nie wydawał się tak czy inaczej językiem. Używam tylko tego, co mam dostępne do zhakowania razem dla przykładów. Nie są w pełni przetestowane ani przetestowane, ale pracowałem z fragmentami kodu wcześniej w innych projektach, więc są to dowody na to, że przykłady kodu ilustrują sposób wdrożenia wspomnianych rozwiązań.

//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

Gdzie oni są? ("Oto niektóre alternatywne metody ...") proszę podać bardziej wyraźne przykłady kodu. –

+0

OK, zaktualizuję odpowiedź z faktycznym przykładem lub link do jednego, gdy dostanę szansę (może za kilka dni lub tygodni, trochę zajęty właśnie teraz). – David

+0

To byłoby bardzo cenne. Dziękuję Ci. –