2012-09-07 26 views
125

Estoy tratando de probar una interfaz javascript complicada con Selenium (utilizando la interfaz de Python, y en varios navegadores). Tengo una serie de botones de la forma:¿Cómo puedo encontrar un elemento que contenga texto específico en Selenium Webdriver (Python)?

<div>My Button</div> 

Me gustaría ser capaz de buscar los botones basados ​​en "Mi botón" (o no entre mayúsculas y minúsculas, las búsquedas parciales tales como "mi botón" o "botón")

Me resulta increíblemente difícil, en la medida en que siento que me falta algo obvio. Lo mejor que tengo hasta ahora es:

driver.find_elements_by_xpath('//div[contains(text(), "' + text + '")]') 

Sin embargo, distingue entre mayúsculas y minúsculas. La otra cosa que he intentado es iterar a través de todos los divs en la página y verificar la propiedad de element.text. Sin embargo, cada vez que reciba una situación de la forma:

<div class="outer"><div class="inner">My Button</div></div> 

div.outer también tiene "Mi botón" según el texto. Para arreglar ESO, he intentado ver si div.outer es el padre de div.inner, pero no pude encontrar la manera de hacerlo (element.get_element_by_xpath ('..') devuelve el elemento primario de un elemento, pero pruebas no iguales a div.outer). Además, iterar a través de todos los elementos en la página parece ser muy lento, al menos usando el controlador de Chrome.

Ideas?

Editar: Esta pregunta salió un poco vaga. Pedirá (y contestados) una versión más específica aquí: How to get text of an element in Selenium WebDriver (via the Python api) without including child element text?

+0

Las respuestas actuales no funcionan para mí. Éste lo hizo: http://sqa.stackexchange.com/a/2486 – alejandro

Respuesta

19

usted podría intentar un XPath como:

'//div[contains(text(), "{0}") and @class="inner"]'.format(text) 
+0

Gracias ... por lo que ayuda a distinguir el interior del exterior, pero que en realidad funciona bien con xpath, solo estaba teniendo ese problema iterando a través de todos los divs. Mi problema con xpath es que no puedo entender cómo hacerlo insensible a las mayúsculas y minúsculas. – josh

+1

xpath 2.0 tiene una función en minúscula, por lo que debería funcionar: '// div [contains (minúscula (texto()), "{0}")]'. Formato (texto) – andrean

+0

¡gracias! aunque, según entiendo, xpath 2.0 no es compatible con los principales navegadores ... – josh

162

intente lo siguiente:

driver.find_elements_by_xpath("//*[contains(text(), 'My Button')]") 
+1

Gracias por la respuesta, era el 50% de lo que necesitaba (me ayudó a comenzar). El formulario al que llegué es este "(// * [contiene (texto(), '" + texto + "')] | // * [@ value = '" + texto + "'])" buscará texto dado no solo dentro de los nodos de los elementos, sino también dentro de los elementos de entrada cuyo texto se configuró mediante el atributo 'valor', es decir, . Aunque tenga en cuenta, el valor debe ser coincidencia estricta, no solo contener el texto. –

+7

También vale la pena mencionar para otros visitantes del motor de búsqueda: si está buscando un enlace, hay métodos 'find_element (s) _by_link_text' y' find_element (s) _by_partial_link_text' –

+2

¿Qué pasa si el texto es dinámico? Es decir, podría contener comillas. ¿Eso no rompería esta solución? – IcedDante

-12

probar esto. Es muy fácil:

driver.getPageSource().contains("text to search"); 

Esto realmente funcionó para mí en el controlador web de selenio.

+6

No funciona si el texto es generado por JavaScript. – palacsint

+2

Esta es una forma de comprobarlo, ya que transfiere todo el contenido de la página a través del cable. Para páginas muy pequeñas esto es aceptable, pero para páginas muy grandes se transfieren todos los contenidos del archivo y se revisan desde el servidor. Un mejor enfoque sería hacerlo en el lado del cliente con xpath, javascript o css. –

+0

Creo que la fuente de toda la página ya debería transferirse a través del cable para que el navegador la represente. –

3

También se puede utilizar con la página modelo objeto, por ejemplo:

probar este código:

@FindBy(xpath = "//*[contains(text(), 'Best Choice')]") 
WebElement buttonBestChoice; 
1
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(), 'YourTextHere')]"))); 
    assertNotNull(driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]"))); 
    String yourButtonName=driver.findElement(By.xpath("//*[contains(text(), 'YourTextHere')]")).getAttribute("innerText"); 
    assertTrue(yourButtonName.equalsIgnoreCase("YourTextHere")); 
Cuestiones relacionadas