¿Cuál es la diferencia entre .// y // * en XPath?

Al encontrar el XPath relativo a través de Firebug: crea

  1. .//*[@id='Passwd'] ——— ¿Qué .//*[@id='Passwd'] si no usamos el punto al inicio? ¿Qué significa?

  2. Simplemente agregue //* en Xpath – resalta — varios elementos de página ———- ¿qué significa?

A continuación se muestran los campos de contraseña de XPaths para Gmail. ¿Cuál es la importancia de * ?

  • .//*[@id='Passwd']

  • //child::input[@type='password']

Todas estas expresiones seleccionan diferentes conjuntos de nodos:

.//*[@id=’Passwd ‘]

Los ‘.’ al principio significa que el procesamiento actual comienza en el nodo actual . El ‘*’ selecciona todos los nodos de elemento que descienden de este nodo actual con el @id id-atributo-valor igual a ‘Passwd’.

¿Qué pasa si no usamos el punto al comienzo? ¿Qué significa?

Luego, debe seleccionar todos los nodos de elemento con un @id id-atributo-valor igual a ‘Passwd’ en todo el documento.

Simplemente agregue // * en el XPath – resalta — varios elementos de página

Esto seleccionaría todos los nodos de elementos en todo el documento.

A continuación se menciona: el campo de contraseñas de XPatht para Gmail es verdadero. ¿Cuál es la importancia de *?

 .//*[@id='Passwd'] 

Esto seleccionaría todos los nodos de elementos que descienden del nodo actual, que @id id-atributo-valor es igual a ‘Passwd’.

// child :: input [@ type = ‘password’]

Esto seleccionaría todos los nodos de elemento hijo con input que @type -attribute-values ​​son iguales a ‘contraseña’. El prefijo child:: axis axis puede omitirse porque es el comportamiento predeterminado.

La syntax de elegir la expresión apropiada se explica aquí en w3school.com .

Y los ejes (punto actual en el procesamiento) se explican aquí en otra página de w3school.com .

Aquí hay varios conceptos clave de XPath en juego …

XPaths absolutos vs relativos ( / vs)

  • / introduce una ruta de ubicación absoluta, que comienza en la raíz del documento.
  • . introduce una ruta de ubicación relativa, comenzando en el nodo de contexto.

Elemento con nombre frente a cualquier elemento ( ename vs * )

  • /ename selecciona un elemento raíz ename
    • ./ename selecciona todos los elementos secundarios ./ename del nodo actual.
  • /* selecciona el elemento raíz, independientemente del nombre.
    • ./* o * selecciona todos los elementos secundarios del nodo de contexto, independientemente de su nombre.

eje descendiente o auto ( //* )

  • //ename selecciona todos los elementos ename en un documento.
    • .//ename selecciona todos los elementos .//ename en o debajo del nodo de contexto.
  • //* selecciona todos los elementos en un documento, independientemente de su nombre.
    • .//* selecciona todos los elementos, independientemente de su nombre, en o debajo del nodo de contexto.

Con estos conceptos en mente, aquí hay respuestas a sus preguntas específicas …

  • .//*[@id='Passwd'] significa seleccionar todos los elementos en o debajo del nodo de contexto actual que tienen un valor de atributo de id igual a 'Passwd' .
  • //child::input[@type='password'] se puede simplificar a //input[@type='password'] y significa seleccionar todos input elementos de input en el documento que tengan un valor de atributo de type igual a 'password' .

El punto en XPath se llama una “expresión de elemento de contexto” . Si coloca un punto al comienzo de la expresión, lo haría específico del contexto. En otras palabras, buscaría el elemento con id="Passwd" en el contexto del nodo al que está llamando el método “find element by XPath”.

El * en .//*[@id='Passwd'] ayuda a hacer coincidir cualquier elemento con id='Passwd' .

  1. Para la primera pregunta : se trata del contexto. Puede ver la syntax para saber qué significa ‘.’, ‘..’ etc. Además, apuesto a que no encontrarás ninguna explicación mejor que este enlace .
  2. Respuesta simplificada para la segunda pregunta : generalmente encontrará nodos que utilicen las tags html como td, a, li, div, etc. Pero ‘*’ significa, encuentre cualquier etiqueta que coincida con su propiedad. Se utiliza principalmente cuando está seguro de una propiedad determinada, pero no de la etiqueta con la que podría aparecer el elemento, por ejemplo, supongamos que quiero una lista de todos los elementos con ID ‘xyz’, ya sea en cualquier etiqueta.

Espero eso ayude 🙂