regulares - Cómo usar regex en localizadores de selenio
regexp mysql ejemplo (4)
Puede usar el comando Selenium getAllLinks para obtener una matriz de los ids de los enlaces en la página, que luego puede recorrer y verificar el href usando 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);
}
}
Estoy usando Selenium RC y me gustaría, por ejemplo, obtener todos los elementos de enlaces con atributos href que coincidan:
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 así)
Gracias
La respuesta anterior es probablemente la forma correcta de encontrar TODOS los enlaces que coincidan con una expresión regular, pero pensé que también sería útil responder a la otra parte de la pregunta, cómo usar la expresión regular en los localizadores Xpath. Necesita usar la función regex matches (), como esta:
xpath=//div[matches(@id,''che.*boxes'')]
(esto, por supuesto, haría clic en el div con ''id = checkboxes'', o ''id = cheANYTHINGHEREboxes'')
Tenga en cuenta, 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 lo 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''. :)
Aquí hay algunos métodos alternativos también 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ódigo 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
*/
Una posible solución es usar sel.get_eval()
y escribir un script JS que devuelva una lista de los enlaces. algo así como la siguiente respuesta: selenio: ¿es posible usar la expresión regular en los localizadores de selenio