【问题标题】:Python Selenium: Find object attributes using xpathPython Selenium:使用 xpath 查找对象属性
【发布时间】:2012-09-16 17:46:59
【问题描述】:

我是 xpath 的新手,正在尝试使用 xpath 获取“值”的值:

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

虽然"type="submit" 很容易找到元素,例如:

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

我一直无法弄清楚如何获得我需要的值,如:

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

有点出乎意料地给出了一个错误:

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

有什么办法解决这个问题吗?

编辑: xpath 是正确的,但它“返回”一个 obj 属性,并且因为它不是元素,所以不允许这样做。我找不到 get_attr_by_xpath() 之类的方法或类似的方法。

【问题讨论】:

  • 也许这是一个愚蠢的建议,但使用原始字符串修复:r"//*[@type='submit']/@value" ?
  • 你试过类似driver.find_element_by_xpath("//a[contains(text(),'Search')]").click()
  • 当我用 lxml 尝试你的 xpath 时,它工作得很好。我试过lxml.html.fromstring(s).xpath("//*[@type='submit']/@value") 并且o/p 是[' Search ']
  • @hayde -- 原始字符串无法修复它。
  • @ RanRag -- 是的,xpath 似乎是正确的,问题似乎与“find_elemnts”有关,因为对象属性不是元素。但是,对于浏览器对象,似乎没有像 get_attr_by_xpath 这样的方法或任何类似的方法。

标签: python xpath selenium


【解决方案1】:

我终于用get_attribute("value")作为:

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

【讨论】:

    【解决方案2】:

    应该是这样的

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

    更新:

    使用您使用的函数,我们只能提取元素而不是其属性。要获取它的属性,表达式应该是这样的

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

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

    【讨论】:

    • @ Kaipa -- 你的更新也是我发现的最接近的东西。然而。如果使用元素,则应该有“find_element”而不是元素或 for 循环。
    • @Jayy:是的,成功了!你说得对。 find_elements_by_xpath() 函数只是试图获取一个元素,而不是一个属性。所以,当我想要它返回一个属性时,我得到了一个错误。我只是把 get_attribute() 放在后面,然后就完成了。谢谢!
    【解决方案3】:

    我当然知道这是 2 年前发布的,但我想补充一点,但被遗漏了。 selenium 提供内置词,可用于提取标签之间的文本或标签内的实际属性值。

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

    这是一个简单的例子:

    ${THE_NAME}=       Get Text           ${XPATH} 
    

    【讨论】:

    • 不想让你失望,但是你提供的代码示例在robotframework中(问题是python及其硒绑定),它会返回节点的文本,而不是值的属性。为了得到那个 - 再次,在robotframework语法中,调用应该是${attribute value}= Get Attribute Value ${the locator}@attribute_name
    猜你喜欢
    • 2016-01-04
    • 1970-01-01
    • 2017-03-17
    • 2021-10-31
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多