Respuesta

10

Sin tener en cuenta los problemas no WATIR de tener etiquetas en primer lugar, o solicitar atributos únicos de sus desarrolladores (o de usted), siempre puede acceder a un elemento mediante sus elementos principales o por índice.

Por ejemplo: texto

@browser.div(:name => "content").span(:index => 1) 
#this is the first span element inside this div 

Puede trabajar a través obstante muchos elementos únicos que necesita antes de llegar al elemento span niño, sin usar Xpath. Por supuesto, solo necesita un elemento primario único para llegar a ese elemento hijo específico, y trabaja desde ese nivel hasta el hijo.

div(:how => what).table(:how => what).td(:how => what).span(:how => what).text 

Otro ejemplo, asumiendo que es el n-ésimo lapso en la página: @ browser.span (: índice =>n)

El por índice enfoque es muy frágil y propenso sin embargo, cuando se realiza una actualización en la página.

+1

Tenga en cuenta que es solo el PRIMER intervalo si está utilizando versiones anteriores de Watir que utilizan una indexación basada, con Watir 2.x o Watir-Webdriver que utilizan indexación basada en cero (como Ruby) ': index => 1' sería la segunda instancia de un lapso dentro del div –

9

Si tiene texto:

browser.span(:text => "Text") 

Si conoce sólo una parte del texto que se puede utilizar expresiones regulares:

browser.span(:text => /Text/) 
8

Hay básicamente tres formas de abordar este desafío en particular. Zeljko ha abordado el primero que se basa en lo que es dentro de el elemento como texto conocido. Adam se refiere a la forma más común, lo que es encierra o contiene el elemento Voy a abordar la tercera vía, que es lo que es cerrado por o lado el elemento.

Si tiene un elemento conocido que está dentro del que desea, puede comenzar con eso y usar el método .parent para obtener el elemento 'contenedor'. Esto también se puede usar para encontrar un elemento 'hermano' usando .parent para llegar al que desea a través de un contenedor común como una fila de la tabla. El primer uso es bastante obvio, pero el segundo es probablemente más común y muy útil cuando se trabaja con tablas.

Por ejemplo, digamos que tiene una tabla con varias filas de datos donde una columna tiene números de pieza únicos y otra columna tiene enlaces "agregar al carrito".Ahora bien, si desea agregar una parte específica de su carro, usted podría utilizar Índice combina con el texto 'añadir al carrito' utilizando un código como el basado en él que es el quinto enlace con el texto específico

browser.link(:text => 'add to cart', :index => 4).click 

Pero esto es frágil porque tan pronto como cambian los resultados, (lo que puede ocurrir mucho con los datos en vivo), su parte ya no es la quinta en esa tabla, y su prueba se romperá. Necesitarás alguna verificación de que has encontrado la parte correcta y no otra cosa en esa fila. Sin embargo, en Watir se puede hacer algo como esto:

browser.cell(:text => 'Part no. 123-45').parent.link(:text => 'add to cart').click 

En el caso de una celda de la tabla, el padre de la célula por lo general será una fila de la tabla, y por lo tanto en la llanura Inglés esto se traduce a 'encontrar la célula con 'parte no 123-45' en él, y luego en esa misma fila, busque y haga clic en el enlace 'agregar al carrito'. (Aunque supongo que lo descubrió solo leyendo el código.)

Puede usar esto para obtener cualquier 'hermano' o incluso solo el 'padre' en sí mismo donde hay algún elemento único al lado o dentro del objeto necesitas interactuar con.

Probablemente pueda hacer algo similar a eso con Xpath, pero buena suerte tiene sentido al leer el código cinco semanas después. Esta es una de las razones por las que prefiero Watir y Watir-Webdriver vs Selenium.

+2

Nunca podría haber imaginado tantas respuestas a un problema simple. –

+3

Un problema simple, pero presentado en una forma muy general sin ningún contexto o HTML circundante. De ahí la variedad de respuestas, cada una de las cuales es mucho menos general que la pregunta. La mía es, sin duda, abordar un nicho más estrecho .. Hmmm una edición útil viene a la mente. –

+1

@DaveMcNulla, ¿Mi respuesta revisada pone las otras respuestas en un contexto un poco más ahora? –

Cuestiones relacionadas