【发布时间】:2015-01-10 16:32:15
【问题描述】:
当我在回答 another question 关于 Selenium 时尝试使用一些 XPath SVG 路径时,我发现 Chrome 上的 XPath 有一个奇怪的行为(我没有在其他浏览器上尝试过)。
在http://www.amcharts.com/svg-maps/?map=usa,为什么不 XPath 工作?
//*[@id="chartdiv"]/div/div[1]/svg/g[7]/g/g[1]
而这个会?
//*[@id="chartdiv"]/div/div[1]/*[name()="svg"]/*[name()="g"][7]/*[name()="g"]/*[name()="g"][2]
我必须进行以下更改:
-
/g变为/*[name()="g"] -
/svg变为/*[name()="svg"] -
/path变为/*[name()="path"]
奇怪的是,我通过右键单击元素 HTML 获得了第一个 XPath,并从那里复制了 XPath。
我在http://gmsgroup.com/municenter.asp 上还有另一个例子:
-
//*[@id='ext-gen203']/*[name()='svg']/*[name()='a']/*[name()='path'][starts-with(@d, 'M136.65')]/..工作, -
//*[@id='ext-gen203']/*[name()='svg']/*[name()='a'][@title='Hawaii']没有。
这里,/*[name()='a'][@title='Hawaii'] 无法获取<a title="Hawaii"></a>,为什么?
【问题讨论】:
-
并非所有元素都在页面的 HTML 源中(例如,
a[@title='Hawaii']是由脚本添加的)。您在什么应用程序中使用 XPath? -
Chrome 开发工具。确实,这些元素当时是由 Javascript 生成的,但它们仍然存在,因为一些不同的 XPath 可以找到它们!
-
Chrome 开发工具如何处理命名空间? SVG 通常位于命名空间中。 (不熟悉那些开发工具,只是好奇)。可能
/svg排除了svg的默认命名空间,而使用/*[name()='svg']只排除了前缀命名空间。
标签: html google-chrome selenium xpath svg