【问题标题】:Using XPath Selector 'following-sibling::text()' in Selenium (Python)在 Selenium (Python) 中使用 XPath 选择器'following-sibling::text()'
【发布时间】:2012-02-13 23:23:05
【问题描述】:

我正在尝试使用 Selenium(在 Python 中)从网站中提取一些信息。我一直在使用 XPaths 选择元素,但在使用以下兄弟选择器时遇到了问题。 HTML如下:

<span class="metadata">
    <strong>Photographer's Name: </strong>
    Ansel Adams
</span>

我可以用

选择“摄影师的名字”
In [172]: metaData = driver.find_element_by_class_name('metadata')

In [173]: metaData.find_element_by_xpath('strong').text
Out[173]: u"Photographer's Name:"

我正在尝试选择标记后的文本部分(示例中为“Ansel Adams”)。我以为我可以使用以下兄弟选择器,但收到以下错误:

In [174]: metaData.find_element_by_xpath('strong/following-sibling::text()')
ERROR: An unexpected error occurred while tokenizing input
The following traceback may be corrupted or invalid
The error message is: ('EOF in multi-line statement', (328, 0))
... [NOTE: Omitted the traceback for brevity] ...
InvalidSelectiorException: Message: u'The given selector strong/following-sibling::text() is either invalid or does not result in a WebElement. The following error occurred:\n[InvalidSelectorError] The result of the xpath expression "strong/following-sibling::text()" is: [object Text]. It should be an element.' 

关于为什么这不起作用的任何想法?

【问题讨论】:

    标签: python xpath selenium


    【解决方案1】:

    @RossPatterson 是正确的。问题是文本'Ansel Adams'不是WebElement,所以你不能使用find_elementfind_elements。如果您将 HTML 更改为

    <span class="metadata">
        <strong>Photographer's Name: </strong>
        <strong>Ansel Adams</strong>
    </span>
    

    然后find_element_by_xpath('strong/following-sibling::*[1]').text 返回“Ansel Adams”。

    【讨论】:

    • 不幸的是,我无法控制 HTML 内容。不过这很奇怪,因为代码可以在在线 [XPath 测试人员] 中运行。好吧,这就引出了第二个问题:是否可以获取&lt;span class="metadata"&gt; 的所有内容(标签和文本)?我可以通过find_elements_by_class_name('metadata') 选择它,但无法弄清楚如何让带有&lt;strong&gt; 标签的文本都完好无损。
    • 你总是可以使用driver.page_source获取整个页面的HTML,然后使用something other than webdriver to parse it
    • 太好了,我不知道driver.page_source,这让我很开心,谢谢!
    【解决方案2】:

    要获取文本“Ansel Adams”,只需使用metaData.get_text()。我不相信find_element_by_* 会让你找到文本节点。

    【讨论】:

    【解决方案3】:

    这在 Selenium 错误报告中有记录: http://code.google.com/p/selenium/issues/detail?id=5459

    “您的 xpath 不返回元素;它返回一个文本节点。虽然这在 Selenium RC(以及扩展的 Selenium IDE)中可能完全可以接受,但 WebDriver WebElement 接口上的方法需要一个元素对象,不仅仅是任何 DOM 节点对象。WebDriver 正在按预期工作。要解决此问题,您需要更改 HTML 标记以将文本节点包装在元素中,例如 ."

    【讨论】:

    • 不幸的是,很难找到实际的文档来说明“WebDriver WebElement 接口上的方法需要一个元素对象,而不仅仅是任何 DOM 节点对象”的意图,这与 Selenium RC 的情况相反。终于在这里找到了:seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/…WebElement,findElement返回的类型,“表示一个HTML元素”。
    【解决方案4】:

    此代码适用于 PHP:

    $this->getText("//span[@class='metadata']/text()[2]");

    我认为你应该尝试使用这样的 xPath 表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2023-03-21
      • 2017-01-07
      相关资源
      最近更新 更多