2009-09-09 13 views
9

sto usando il selenio RC e mi piacerebbe, per esempio, per ottenere tutti gli elementi collegamenti con attributo href quella partita:Come usare espressioni regolari in localizzatori selenio

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

vorrei usare:

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

che restituirebbe un elenco dell'attributo nome di tutti i collegamenti che corrispondono alla regex. (o qualcosa di simile)

grazie

+0

Quindi cosa non funziona e in che modo non funziona? Puoi pubblicare l'HTML (o un suo frammento) a cui stai confrontando? –

+0

@Paul, l'esempio fornito e il metodo get_attribute() restituisce solo un singolo elemento, non un elenco. Poster sta chiedendo qual è l'equivalente per la restituzione di un elenco di attributi, ad esempio. – David

risposta

3

È possibile utilizzare i getAllLinks comando selenio per ottenere un array degli ID di link sulla pagina, che si potrebbe quindi scorrere e controllare il href utilizzando il getAttribute, che prende il locatore seguito da un @ e il nome dell'attributo. Per esempio in Java questo potrebbe essere:

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

Non penso che sia quello che voleva: vuole trovare un elemento usando una regex come locator (come parte dell' XPATH) – olamundo

+0

La domanda menziona come ottenere * tutti * i link che corrispondono alla regex. Siccome il Selenium non supporta questo (per quanto ne so), ottenere tutti i collegamenti dalla pagina e quindi usare la lingua del client per controllare le posizioni rispetto a un'espressione regolare è una soluzione ragionevole. –

+0

Ho modificato il mio codice di esempio per eseguire una corrispondenza di espressioni regolari. Non l'ho fatto in origine perché dipende dalla lingua del client in uso e volevo mantenere la risposta semplice. –

10

La risposta di cui sopra è probabilmente il modo giusto per trovare tutti i link che corrispondono a un'espressione regolare, ma ho pensato che sarebbe anche essere utile per rispondere dall'altra parte del domanda, come usare regex in localizzatori Xpath. È necessario utilizzare le partite regex() la funzione, in questo modo:

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

(questo, naturalmente, sarebbe fare clic sul div con 'Id = caselle di controllo', o 'id = cheANYTHINGHEREboxes')

Be consapevole, comunque, che la funzione matches non è supportata da tutte le implementazioni native del browser di Xpath (il più vistosamente, usando questo in FF3 si genera un errore: invalid xpath [2]).

In caso di problemi con il browser in uso (come ho fatto con FF3), provare a utilizzare AllowNativeXpath di Selenium ("false") per passare all'interprete JavaScript Xpath. Sarà più lento, ma sembra funzionare con più funzioni Xpath, tra cui "match" e "ends-with". :)

+0

come controllate xpath? Di solito uso l'aggiunta di firefox su xpath-checker. Ma non riconosce la regex in xpath. – Guy

+0

L'utilizzo del componente aggiuntivo per il controllo xpath è un'ottima idea! Non ho mai pensato di cercarne uno. Non ho scritto troppi localizzatori xpath, però. Nel mio lavoro, ho creato un framework di test indipendente dagli strumenti che crea locator per più strumenti, incluso Selenium, utilizzando la nostra semplice sintassi. Ho solo dovuto imparare questi localizzatori xpath abbastanza bene da scrivere del codice che potesse generarli. :) –

+0

+1 per allowNaticeXPath (false) tip. Mi ha risparmiato un sacco di grattacapi in questo momento :) –

0

Ecco alcuni metodi alternativi anche per Selenium RC. Queste non sono soluzioni al selenio, ma consentono l'interazione con le strutture dati del linguaggio di programmazione e il selenio.

È anche possibile ottenere l'origine della pagina HTML, quindi regolare l'origine per restituire una serie di collegamenti. Utilizza il raggruppamento delle espressioni regolari per separare gli URL, collegare il testo/ID, ecc. E puoi quindi trasferirli nuovamente al selenio per fare clic su o navigare.

Un altro metodo è ottenere l'origine della pagina HTML o innerHTML (tramite i locatori DOM) di un elemento padre/root, quindi convertire l'HTML in XML come oggetto DOM nel linguaggio di programmazione. È quindi possibile attraversare il DOM con l'XPath desiderato (con espressione regolare o meno) e ottenere un nodeset solo dei collegamenti di interesse. Dalla loro analisi esce il testo del link/ID o URL e puoi tornare al selenio per fare clic su o navigare.

Su richiesta, sto fornendo esempi di seguito. Sono lingue miste, dal momento che il post non sembra essere comunque specifico per la lingua. Sto solo usando quello che avevo a disposizione per hackerare insieme per degli esempi. Non sono stati completamente testati o testati, ma in passato ho lavorato con bit del codice in altri progetti, quindi questi sono esempi di codice concettuali su come implementare le soluzioni che ho appena menzionato.

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

Dove sono? ('Ecco alcuni metodi alternativi ...') per favore fornisci esempi di codice più espliciti. –

+0

Ok, aggiornerò la risposta con un esempio reale o un collegamento a uno quando avrò una possibilità (forse in pochi giorni o settimane, un po 'occupato in questo momento). – David

+0

Sarebbe molto apprezzato. Grazie. –