【问题标题】:getting attribute via xpath query succesfull in browser, but not in Robot Framework在浏览器中通过 xpath 查询成功获取属性,但在 Robot Framework 中没有
【发布时间】:2014-05-25 14:18:45
【问题描述】:

我有一个 XPATH 查询,我用它从某个 HTML 元素中获取高度,当我通过 XPath Helper-plugin 在 Chrome 中执行它时,它完美地返回了我想要的值。

//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height

但是,当我通过机器人框架中的 Get Element Attribute-keyword 使用相同的查询时

Get Element Attribute//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height

...然后我收到关于此 XPATH 的 InvalidSelectorException。

InvalidSelectorException: Message: u'invalid selector: Unable to locate an 
element with the xpath expression `//*/div[@class="BarChart"]/*[name()="svg"]/*
[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/`

因此,Robot Framework 或 Selenium 删除了 @-sign 及其后面的所有内容。我认为这是一个逃生问题,并在@height 之前添加和删除了一些斜线,但没有成功。我也尝试将这个查询的结果封装在 string()-command 中,但这也没有成功。

有人有办法防止我的 XPATH 查询被破坏吗?

【问题讨论】:

    标签: xpath svg selenium-webdriver robotframework


    【解决方案1】:

    当您使用 Robot 时,您似乎无法在 XPath 本身中包含属性轴。您需要通过 XPath 检索元素,然后在其之外指定属性名称。看起来语法是这样的:

     Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])@height 
    

    或者也许(我从未使用过机器人):

     Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])[1]@height 
    

    This documentation

    attribute_locator 由元素定位器后跟@符号和属性名称组成,例如“element_id@class”。

    所以我认为我上面发布的内容是正确的。

    【讨论】:

    • 您好 JLRishe,这正是我正在寻找的解决方案。我知道机器人框架中 XPATH 查询的这个前缀,但通常不需要放置它。我使用的大多数 XPATH 查询都可以正常工作,但是这个需要它。无论如何,谢谢你的帮助
    • 如果您在@height 之前删除/,您最初的尝试可能会奏效。您收到的错误消息似乎也表明了这一点(它认为@height 之前的/ 是您的元素选择器的一部分)。
    • 不,那没用,那是我尝试过的事情之一。此外,我在网上找到了几个例子,甚至说使用这个 / -sign。
    • @JLRishe 你能看看我的问题并解决我吗stackoverflow.com/questions/23189178/…
    【解决方案2】:

    您的观察是正确的,关键字似乎删除了最后一个 @ 之后的所有内容。更准确地说,它使用@ 将元素定位器与属性名称分开,并通过在最后一个@ 字符处拆分字符串来做到这一点。

    任何转义都无法解决问题,因为此时代码没有进行任何解析。这是执行该操作的确切代码(在撰写本文时...):

    def _parse_attribute_locator(self, attribute_locator):
        parts = attribute_locator.rpartition('@')
        ...
    

    简单的解决方案是删除尾部斜杠,这样您的 xpath 将如下所示:

    //*/div[@class="BarChart"]/... and @class="bar bar1"]@height`
    

    【讨论】:

      猜你喜欢
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-11-19
      • 1970-01-01
      • 2019-02-18
      • 2019-05-06
      • 2017-11-18
      • 2017-08-06
      相关资源
      最近更新 更多