Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在浏览器中通过xpath查询成功获取属性,但在Robot框架中未成功_Xpath_Svg_Selenium Webdriver_Robotframework - Fatal编程技术网

在浏览器中通过xpath查询成功获取属性,但在Robot框架中未成功

在浏览器中通过xpath查询成功获取属性,但在Robot框架中未成功,xpath,svg,selenium-webdriver,robotframework,Xpath,Svg,Selenium Webdriver,Robotframework,我有一个特定的XPATH查询,我使用它从某个HTML元素获取高度,当我通过XPATH帮助器插件在Chrome中执行它时,它会完美地返回所需的值 //*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height 但是,当我在Robot框架中通过Get-Element-Attribute关键字使用相同的查询时 Get Elem

我有一个特定的XPATH查询,我使用它从某个HTML元素获取高度,当我通过XPATH帮助器插件在Chrome中执行它时,它会完美地返回所需的值

//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height
但是,当我在Robot框架中通过Get-Element-Attribute关键字使用相同的查询时

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"]/`
因此,机器人框架或Selenium移除了标志及其后的一切。我认为这是一个逃避问题,并在@height之前添加和删除了一些斜线,但没有成功。我还尝试将此查询的结果封装在string()-命令中,但也没有成功


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

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

 Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])@height 
//*/div[@class="BarChart"]/... and @class="bar bar1"]@height`
或者(我从未使用过机器人):

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


因此,我认为我在上面发布的内容是正确的。

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

再多的转义也解决不了问题,因为代码此时没有进行任何解析。这是执行该操作的确切代码(截至本文撰写时…):

def _parse_attribute_locator(self, attribute_locator):
    parts = attribute_locator.rpartition('@')
    ...
简单的解决方案是删除尾部的斜杠,因此xpath将如下所示:

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

嗨,JLRishe,这正是我想要的解决方案。我知道Robot框架中XPATH查询的前缀,但通常不需要放置它。我使用的大多数XPATH查询在没有查询的情况下都可以正常工作,但这一个需要它。无论如何,感谢您的帮助如果您在
@height
之前删除
/
,您最初的尝试可能会成功。您收到的错误消息似乎也表明了这一点(它认为
/
之前的
/
是元素选择器的一部分)。此外,我在网上发现了几个例子,甚至说要使用这个/-符号。@JLRishe你能帮我解决问题吗