locator how firepath examples selenium xpath

selenium - how - XPath: diferencia entre punto y texto()



xpath selenium java (2)

Mi pregunta es sobre aspectos específicos del uso de puntos y text() en XPath . Por ejemplo, las siguientes líneas find_element devuelven el mismo elemento:

driver.get(''http://stackoverflow.com/'') driver.find_element_by_xpath(''//a[text()="Ask Question"]'') driver.find_element_by_xpath(''//a[.="Ask Question"]'')

Entonces cuál es la diferencia? ¿Cuáles son los beneficios y desventajas de usar . y el text() ?


Hay una diferencia entre y text() , pero esta diferencia podría no aparecer debido a su documento de entrada.

Si su documento de entrada se veía como (el documento más simple que uno pueda imaginar dadas sus expresiones XPath)

Ejemplo 1

<html> <a>Ask Question</a> </html>

Entonces //a[text()="Ask Question"] y //a[.="Ask Question"] devuelven exactamente el mismo resultado. Pero considere un documento de entrada diferente que parece

Ejemplo 2

<html> <a>Ask Question<other/> </a> </html>

donde el elemento a también tiene un elemento secundario que sigue inmediatamente después de "Preguntar". Dado este segundo documento de entrada, //a[text()="Ask Question"] sigue //a[.="Ask Question"] elemento a, mientras que //a[.="Ask Question"] no devuelve nada.

Esto se debe a que el significado de los dos predicados (todo entre [ y ] ) es diferente. [text()="Ask Question"] realidad significa: devolver verdadero si alguno de los nodos de texto de un elemento contiene exactamente el texto "Hacer pregunta". Por otra parte, [.="Ask Question"] significa: devolver verdadero si el valor de cadena de un elemento es idéntico a "Hacer pregunta".

En el modelo XPath, el texto dentro de los elementos XML se puede dividir en varios nodos de texto si otros elementos interfieren con el texto, como en el Ejemplo 2 anterior. Allí, el other elemento se encuentra entre "Preguntar" y un carácter de nueva línea que también cuenta como contenido de texto.

Para hacer un ejemplo aún más claro, considere como un documento de entrada:

Ejemplo 3

<a>Ask Question<other/>more text</a>

Aquí, el elemento a en realidad contiene dos nodos de texto, "Hacer pregunta" y "más texto", ya que ambos son hijos directos de a . Puede probar esto ejecutando //a/text() en este documento, que devolverá (resultados individuales separados por ---- ):

Ask Question ----------------------- more text

Por lo tanto, en tal escenario, text() devuelve un conjunto de nodos individuales, mientras que . en un predicado se evalúa la concatenación de cadenas de todos los nodos de texto. Nuevamente, puede probar esta afirmación con la expresión de ruta //a[.=''Ask Questionmore text''] que devolverá correctamente el elemento a.

Finalmente, tenga en cuenta que algunas funciones XPath solo pueden tomar una sola cadena como entrada. Como LarsH ha señalado en los comentarios, si a una función de XPath (por ejemplo, contains() ) se le asigna una secuencia de nodos, solo procesará el primer nodo e ignorará silenciosamente el resto.


Hay una gran diferencia entre el dot (".") Y el text() :

  • El dot (".") En XPath se denomina "expresión de elemento de contexto" porque se refiere al elemento de contexto. Esto podría coincidir con un nodo (como un element , attribute o text node ) o un valor atómico (como una string , un number o un valor boolean ). Mientras que text() refiere a unir solo el element text que está en forma de string .

  • La notación de dot (".") Es el nodo actual en el DOM. Este va a ser un objeto de tipo Nodo mientras se XPath texto de la función XPath () para obtener el texto de un elemento, solo se obtiene el texto hasta el primer elemento interno . Si el texto que busca está después del elemento interno , debe usar el nodo actual para buscar la cadena y no la función de texto XPath ().

Para un ejemplo :-

<a href="something.html"> <img src="filename.gif"> link </a>

Aquí, si desea buscar a elemento de anclaje mediante el enlace de texto, debe usar el dot (".") . Porque si usa //a[contains(.,''link'')] encuentra el elemento ancla en a elemento pero si usa //a[contains(text(),''link'')] la función de text() no parece para encontrarlo.

Espero que te ayude..:)