dom - ¿Volcado del árbol HTML xpath? usando Ruby Watir
webdriver watir-webdriver (2)
¡Ayuda! Al pasar cuidadosamente por el IRB para controlar un navegador (Firefox y Chrome) usando la biblioteca Watir, parece que las direcciones xpath son demasiado furtivas para confiar. P.ej. en un momento, el xpath para el equilibrio parece consistente, entonces uso esa dirección en mi script. A veces funciona, pero a menudo se cuelga con "elemento no encontrado", aunque cada vez que paso manualmente, los datos de la página web están ahí (firebug inspeccionar para confirmar).
Sí, usar sitios que dependen de Ajax, pero no cambiar eso ... sitios web bancarios que prácticamente no cambian de una visita a otra.
Así que pregunta ... ¿hay alguna forma de que watir-webdriver simplemente pueda darme un volcado largo y detallado de todo lo que ve en el DOM en este momento, en la forma de un árbol xpath? Me ayudaría a solucionar problemas.
La gran respuesta es no usar xpath, sino usar watir ya que la interfaz de usuario está destinada a ser utilizada.
Cuando se trata de un medio para especificar elementos en la automatización del navegador, en general, Xpath es malo, es LENTO, el código que crea a menudo es muy frágil, y es casi imposible de leer y darle sentido. . Úselo solo como un último recurso cuando nada más funcionará.
Si está utilizando una Watir API (como con Watir o Watir-webdriver), entonces desea identificar el elemento en función de sus propios atributos, como clase, nombre, ID, texto, etc. Si eso no funciona, identifíquelo en el contenedor más cercano que envuelve el elemento que tiene una manera de encontrarlo de manera única. Si eso no funciona, identifíquelo por un hermano o subelemento y use el método .parent
como una forma de subir el dom al elemento contenedor primario.
Hasta el punto de ser frágil y difícil de leer, compare lo siguiente tomado de los comentarios y considere el código usando element_by_xpath sobre esto:
/html/body/form/div[6]/div/table/tbody/tr[2]/td[2]/table/tbody/tr[2]/td/p/table[2]/tbody/tr/td[2]/p/table/tbody/tr[3]/td[2]
y luego compare esto (donde todo el código es más corto que solo el xpath)
browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:index => 1).text
o para ser un poco menos frágil reemplazar índice por algún atributo de la celda que es el texto que desea
browser.cell(:text => "Total Funds Avail. for Trading").parent.cell(:class => "balanceSnapShotCellRight").text
El ejemplo de xpath es muy difícil de entender, no tiene idea de qué elemento está buscando o por qué el código podría estar seleccionando ese elemento. Y dado que hay tantos valores de índice, cualquier cambio en el diseño de la página o solo filas adicionales en la tabla que se encuentra sobre la que desea romperá ese código.
El segundo es mucho más fácil de entender, puedo decir simplemente leyendo lo que el script está tratando de encontrar en la página y cómo lo está ubicando. Las filas adicionales en la tabla u otros cambios en el diseño de la página no romperán el código. (con la excepción de reorganizar las columnas en la tabla, e incluso eso podría evitarse si tuviera que hacer uso de la clase o alguna otra característica de la celda objetivo (como hizo un ejemplo en los comentarios a continuación)
Para el caso, si el uso de la clase es exclusivo de ese elemento en la página, entonces
browser.cell(:class => ''balanceSnapShotCellRight'').text
Funcionaría bien siempre y cuando solo haya una celda con esa clase en la tabla.
Ahora, para ser justos, sé que hay formas de usar xpath de forma más elegante para hacer algo similar a lo que estamos haciendo en el código Watir anterior, pero mientras esto es cierto, no es tan fácil de leer y trabajar, y no es así. la mayoría de la gente comúnmente (mal) usa xpath para seleccionar objetos, especialmente si han usado grabadores que crean un código críptico xpath frágil similar al ejemplo anterior)
Las respuestas a esta pregunta SO describen los tres enfoques básicos para identificar elementos en Watir. Cada respuesta cubre un enfoque, que uno usaría depende de qué funciona mejor en una situación dada.
Si encuentra un desafío en una página determinada, comience una pregunta al respecto e incluya una muestra del HTML antes / después / alrededor del elemento con el que está tratando de trabajar, y la gente de aquí generalmente puede indicarle el camino.
Si aún no lo has hecho, repasa algunos de los tutoriales de la wiki de Watir y observa cómo rara vez se usa xpath.
Por último, mencionas Firewatir. No use Firewatir, está desactualizado y ya no se está desarrollando y no funcionará con ninguna versión reciente de FF. En su lugar, use Watir-Webdriver para el controlador Firefox o Chrome (o IE).
Solo necesita dar salida al "innerXml" (no conozco a Watir) del nodo seleccionado por esta expresión XPath:
/
Actualización :
En caso de que por "volcado" quiera decir algo diferente, como un conjunto de expresiones XPath seleccionando cada nodo, entonces eche un vistazo a la respuesta de esta pregunta:
https://.com/a/4747858/36305