2012-09-25 10 views
17

Soy nuevo en XPath, tratando de obtener el valor del "valor" usando XPath:Python Selenio: Encuentra atributos de objeto utilizando XPath

<input type="submit" value=" Search " class="long searchButton" style="width:190px !important;"> 

si bien es fácil de encontrar elemento por "type="submit" como:

browser.find_elements_by_xpath("//*[@type='submit']") 

no he sido capaz de encontrar la manera de obtener los valores que necesito, como:

browser.find_elements_by_xpath("//*[@type='submit']/@value") 

un tanto se espera que da un error:

expression "//*[@type=\'submit\']/@value" is: [object Attr]. It should be an element 

¿Alguna idea de cómo solucionar esto?

EDITAR: El xpath es correcto, pero "devuelve" un atributo obj y como no es un elemento, no está permitido. No puedo encontrar un método como get_attr_by_xpath(), o algo similar.

+0

tal vez esta es una sugerencia tonta pero ¿el uso de cadenas primas REVISIÓN: 'r "// * [@ type = 'submit'] Valor/@" ¿? –

+0

has probado algo como 'driver.find_element_by_xpath (" // a [contains (text(), 'Search')] "). Click()' – avasal

+0

Cuando probé tu xpath con lxml funcionó bien. Intenté 'lxml.html.fromstring (s) .xpath (" // * [@ type = 'submit']/@ value ")' y el o/p es '['Search']' – RanRag

Respuesta

28

finalmente utilicé get_attribute("value") como:

for i in browser.find_elements_by_xpath("//*[@type='submit']"): 
    print i.get_attribute("value") 
2

Sería como este

browser.find_elements_by_xpath("//*[@type='submit']/@value").text 

Actualización:

Con la función utilizada por usted, que sólo se puede extraer el elemento no su atributo. Para conseguir su atributo, la expresión debe ser algo como esto

browser.find_elements_by_xpath("//*[@type='submit']").get_attribute("value") 

Ref: http://selenium-python.readthedocs.org/en/latest/api.html#selenium.webdriver.remote.webelement.WebElement.find_elements_by_tag_name

+0

@ Kaipa - da el mismo error. – root

+0

@ Kaipa: su actualización también es lo más cercano que encontré. Sin embargo. Debe haber elementos 'find_element' no o un bucle for si se usan elementos. – root

+0

@Jayy: sí, ¡funcionó! tienes razón. La función find_elements_by_xpath() solo intenta obtener un ** elemento **, no un ** atributo **. Entonces, tengo un error cuando quiero. Devuelve un atributo. Acabo de poner get_attribute() siguiendo, luego hecho. ¡Gracias! – Catbuilts

2

Desde luego que esto fue publicada hace más de 2 años , pero me gustaría agregarle un poco que quedó fuera. selenio proporciona palabras integradas que podrían utilizarse para extraer el texto que está entre las etiquetas o los valores de los atributos reales dentro de las etiquetas.

${XPATH} xpath=(//td[@title='mytitle']/../td)[2]  

Aquí está un ejemplo rápido:

${THE_NAME}=  Get Text   ${XPATH} 
+0

no quiero decepcionarte, pero la muestra del código que has proporcionado está en robotframework (la pregunta es para python y sus enlaces de selenio), y devolverá el texto del nodo, no el valor del atributo. Para obtener eso otra vez, en la sintaxis de robotframework, la llamada debe ser '$ {attribute value} = Get Attribute Value $ {the locator} @ attribute_name' – Todor

Cuestiones relacionadas