De las muchas funciones findElement(s)/By en Selenium, ¿cuándo usarías una sobre la otra?

Resuelto Matt I asked hace 6 años • 2 respuestas

Selenium incluye funciones findElement, así...

.find_element_by_

id
link_text
partial_link_text
name
class_name
tag_name
css_selector
xpath

Es evidente que algunas están limitadas por diseño debido a cómo se creó la página HTML, como id, link_text, name, tag_name, ya que no todas las etiquetas pueden contener una id, link_text, etc... Sin embargo, css_selector y xpath pueden hacerlo. prácticamente todo lo que estos pueden hacer, y algo más, pero parecen estar limitados en cuanto a con qué pueden interactuar. Por ejemplo, es posible que no se pueda hacer clic en algunos botones con xpath, pero sí con css_selector.

Entonces me pregunto, ¿cuándo querríamos usar uno sobre el otro (específicamente xpath o css_selector)?

¿Las otras funciones (id, link_text, etc.) no son útiles, ya que (al menos) encuentro que xpath/css_selector también puede hacerlo?

¿Hay algún beneficio al usar, digamos, link_text, sobre xpath/css_selector?

Matt I avatar Jan 02 '18 07:01 Matt I
Aceptado

En mi experiencia, CSS es el selector preferible porque puede ser conciso, está bien documentado y es probable que los desarrolladores web tengan más experiencia y exposición a él.

id , name , tag_name y class_name se pueden reproducir fácilmente con CSS simple, por lo que evitaría usarlos explícitamente.

p.ej

identificación ; #mi identificación

nombre ; [nombre="mi_nombre"]

nombre_etiqueta ; mi_etiqueta

nombre de la clase ; .mi clase

El uso de XPath suele ser muy difamado; etiquetado como lento e inestable. Sin embargo, no estoy de acuerdo con este punto de vista.

Cuando entrevisto a personas, me estremezco cuando dicen que evitan Xpath porque es lento y frágil. La velocidad ya no es una preocupación y xpath es tan frágil como la persona que lo escribió. Sin embargo, prefiero la sintaxis de los selectores CSS, por eso elegiría XPath para la mayoría de los casos de uso.

Hay 3 escenarios en los que XPath es la mejor opción;

  • Se pueden reemplazar varios selectores CSS con una consulta XPath (por ejemplo, buscar elemento y luego iterar a través de subelementos se puede realizar en un xpath)

  • XPath puede seleccionar según el texto, mientras que CSS Selector no puede

  • XPath le permite recorrer el árbol DOM, lo que puede ser realmente útil si solo puede identificar un control por su hijo.

Siempre evitaría seleccionar por texto si es posible, pero si tuviera que hacerlo, preferiría usar XPath en lugar de los métodos integrados Link Text y Partial Link Text porque la consulta XPath me permitiría ser más expresivo y seleccionar más que simplemente etiquetas de anclaje.

Finalmente, una vez que se utiliza XPath, la "clase" se trata como una cadena literal en lugar de una matriz de nombres de clases como lo admiten los selectores CSS;

HTML: <div class="ab cd">

CSS matches: div.ab
CSS matches: div.cd
CSS matches: div.cd.ab
CSS matches: div.ab.cd

XPath matches: //div[@class="ab cd"]
XPath matches: //div[contains(@class, "ab")]
XPath matches: //div[contains(@class, "cd")]
XPath matches: //div[contains(@class, "ab") and contains(@class, "cd")]

XPath DOES NOT match: //div[@class="cd"]
XPath DOES NOT match: //div[@class="ab"]
XPath DOES NOT match: //div[@class="cd ab"]
Robbie Wareham avatar Jan 02 '2018 19:01 Robbie Wareham

Esta pregunta ha sido formulada y respondida en numerosos foros en diferentes formatos. Considerándolos todos si priorizamos los localizadores la lista quedaría de la siguiente manera:

  • id : seleccione el elemento con el idatributo especificado.
  • nombre : seleccione el primer elemento con el nameatributo especificado.
  • link_text : seleccione el elemento de enlace (etiqueta de anclaje) que contiene texto que coincide con el especificado LinkText.
  • parcial_link_text : seleccione el elemento de enlace (etiqueta de anclaje) que contiene texto que coincide con el especificado PartialLinkText.
  • tag_name : Localiza el elemento usando un archivo Tag Name.
  • class_name : Localiza el elemento usando un archivo ClassName.
  • css_selector : Selecciona el elemento usando CssSelectors.
  • xpath : localiza un elemento usando una XPathexpresión.

Entonces la pregunta ahora es ¿ Qué hay de nuevo ?

La respuesta es que el selenio ha evolucionado mucho recientemente . WebDriverahora es un W3C Recommendation Candidate. Las cosas internas Seleniumestán cambiando bastante rápido. Ya no se trata sólo de elegir el localizador. Necesitamos utilizar un localizador que:

  • Identificar de forma única un elemento .
  • Se debe optimizar el rendimiento del localizador.

Teniendo estos dos factores en mente, la mejor estrategia sería burlarse del DOM . Menciona W3C Recommendation Candidatela lista de localizadores según lo siguiente:

Localizadores de selenio

Por tanto, el veredicto es claro y conciso.

undetected Selenium avatar Jan 02 '2018 05:01 undetected Selenium