2009-09-09 330 views
9

estoy usando RC selenio y me gustaría, por ejemplo, para obtener todos los elementos de enlaces con el atributo href ese partido:Cómo utilizar expresiones regulares en los localizadores de selenio

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

me gustaría usar:

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

que devolvería una lista del atributo de nombre de todos los enlaces que coinciden con la expresión regular. (o algo parecido)

gracias

+0

Entonces, ¿qué no funciona y de qué manera no funciona? ¿Puedes publicar el HTML (o un fragmento del mismo) con el que coincides? –

+0

@Paul, dado el ejemplo y el método get_attribute() solo devuelve un solo elemento, no una lista. Poster pregunta cuál es el equivalente para devolver una lista de atributos, por ejemplo. – David

Respuesta

3

Puede utilizar los getAllLinks comando selenio para obtener un conjunto de los identificadores de enlaces en la página, lo que podría a continuación, recorrer y comprobar el href utilizando el getAttribute, que toma el localizador seguido de un @ y el nombre del atributo. Por ejemplo en Java esto podría ser:

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

No creo que eso sea lo que quería, quiere encontrar un elemento que use una expresión regular como el localizador (como parte de XPATH) – olamundo

+0

La pregunta menciona que se obtienen * todos * enlaces que coincidan con la expresión regular. Como Selenium no es compatible con esto (que yo sepa), obtener todos los enlaces de la página y luego usar el idioma de su cliente para verificar las ubicaciones con una expresión regular es una solución sensata. –

+0

He editado mi código de ejemplo para hacer una coincidencia de expresiones regulares. No lo hice originalmente porque depende del idioma del cliente en uso, y quería mantener la respuesta simple. –

10

La respuesta anterior es probablemente el camino correcto para encontrar todos los enlaces que coinciden con una expresión regular, pero pensé que también sería útil para responder a la otra parte de la pregunta, cómo usar regex en localizadores Xpath. Es necesario utilizar las coincidencias de expresiones regulares() la función, así:

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

(esto, por supuesto, haría clic en el div 'id = casillas de verificación', o 'id = cheANYTHINGHEREboxes')

Sea sabiendo, sin embargo, que la función de coincidencias no es compatible con todas las implementaciones de navegador nativas de Xpath (lo más llamativo, usar esto en FF3 arrojará un error: invalid xpath [2]).

Si tiene problemas con su navegador en particular (como hice con FF3), intente usar allowNativeXpath ("falso") de Selenium para cambiar al intérprete JavaScript Xpath. Va a ser más lento, pero parece funcionar con más funciones de Xpath, como 'coincidencias' y 'termina con'. :)

+0

¿cómo verificas tu xpath? Suelo usar el complemento de firefox en xpath-checker. Pero no reconoce la expresión regular en xpath. – Guy

+0

¡Usar ese complemento xpath-checker es una gran idea! Nunca pensé buscar uno. Aunque no tengo demasiados localizadores xpath. En mi trabajo, construí un marco de prueba independiente de la herramienta que construye localizadores para múltiples herramientas, incluyendo Selenium, usando nuestra propia sintaxis simple. Solo tuve que aprender estos localizadores xpath lo suficientemente bien como para escribir algún código que pudiera generarlos. :) –

+0

+1 para allowNaticeXPath (falso) tip. Me salvó un montón de rasguños en la cabeza :) –

0

Aquí hay algunos métodos alternativos para Selenium RC. Estas no son soluciones de Selenio puro, permiten la interacción con las estructuras de datos de su lenguaje de programación y el Selenio.

También puede obtener la fuente de la página HTML, luego la expresión regular la fuente para devolver un conjunto de enlaces. Use la agrupación de expresiones regulares para separar las URL, el texto/ID del enlace, etc., y puede volver a pasarlas al selenio para hacer clic o navegar.

Otro método es obtener fuente de página HTML o innerHTML (a través de localizadores DOM) de un elemento primario/raíz y luego convertir el HTML a XML como objeto DOM en su lenguaje de programación. Puede recorrer el DOM con el XPath deseado (con expresión regular o no) y obtener un conjunto de nodos de solo los enlaces de interés. Después de analizar el texto/ID o URL del enlace, puede volver al selenio para hacer clic o navegar.

A petición, proporciono ejemplos a continuación. Son idiomas mixtos ya que la publicación no parece ser específica para el idioma de todos modos. Solo estoy usando lo que tenía disponible para hackear juntos por ejemplos. No están totalmente probados o probados en absoluto, pero he trabajado con partes del código en otros proyectos, por lo que estos son ejemplos de códigos de prueba de cómo implementaría las soluciones que acabo de mencionar.

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

¿Dónde están? ('Aquí hay algunos métodos alternativos ...') proporcione ejemplos de código más explícitos. –

+0

Ok, actualizaré la respuesta con un ejemplo real o un enlace a una cuando tenga la oportunidad (tal vez en unos días o semanas, un poco ocupado en este momento). – David

+0

Eso sería muy apreciado. Gracias. –

Cuestiones relacionadas