如何根据命名空间中的属性值找到元素?

时间:2015-09-17 15:53:41

标签: html selenium xpath attributes

任何人都可以建议xpath表达式使用值' DRIVE_20150917-162707' DRIVE_20150917-162707'来找到以下节点。 ?

var request = gapi.client.analytics.management.filters.insert(
    {
      'accountId': accountId,
      'resource': {
        'name': filterName,
        'type': 'LOWERCASE',
        'lowercaseDetails': {
          'field': "Hostname"
        }
      }
    });

3 个答案:

答案 0 :(得分:0)

不确定问题是什么,你尝试了什么?以下内容:

//h4[@ext:qtip="DRIVE_20150917-162707"]

将在文档中找到值h4的所有ext:qtip="DRIVE_20150917-162707"元素。与任何名称空间一样,必须确保正确绑定。如果你不能或不知道如何,你可以试试这个:

//h4[@*[local-name() = 'qtip'][. ='DRIVE_20150917-162707']]

更新:显然,Selenium now allows namespace prefixesaccording to the source(或者更好,current version),它们会根据给定的前缀自动注册它们。他们警告你,它不适用于Android。

不确定它是当前的稳定分支,不确定它们的修复是否也适用于命名空间中的属性,但是您在下面的注释中提到的问题有不同的原因(即,您的文档根本不包含该节点)。看一下Firepath在浏览器中试用它,它应该和Selenium一样。

更新,try the expression above online

只需点击链接,我就创建了一个小小的演示。如果你仍然卡住,那么please give a minimal example that demonstrates the wrong behavior

更新2,使用Firefox进行此方法的错误,以及解决方法

根据您在下面的评论,您说它适用于local-name() = 'ext:qtip',属性节点上的表达式local-name()将返回前缀和本地名称。这可能是MDN saying that the namespace axis is not supported的结果,也可能是this bug report never implemented的结果(具体见Michael Sperberg-McQueen's comment #28)。

这是一个奇怪的错误,因为description of local-name() at MDN明确遵循官方XPath标准的描述,并没有提到不兼容性。

我发现了另一个奇怪的错误。至少在使用Firepath(下面使用Firefox XPath)时,我在HTML5文档的html元素上得到了以下结果:

<!DOCTYPE html>
<html xmlns:my="http://other">
    <head>
        <title></title>
    </head>
    <body my:other="Yes, in another world!">
        <p>Hello world!</p>
    </body>
</html>
  • local-name(//*[1])返回“html”,正确
  • name(//*[1])返回“HTML”,不正确
  • namespace-uri(//*[1])返回“http://www.w3.org/1999/xhtml”,更正,但不符合name()返回的内容
  • local-name(//body/@*[1])返回“我的:其他”,不正确
  • name(//body/@*[1])返回“我的:其他”,正确
  • local-name(//body/@*[1])返回“”(空字符串),不正确

我尝试使用和不使用名称空间声明,它没有任何区别。这显然是Firefox处理命名空间中的一个错误,不确定它是否已被报告(除了已经提到的错误报告之外,无法轻易找到错误报告)。其他浏览器也可以这样做,甚至是正确的,我只用Firefox测试过。

考虑到Firefox中所有这些奇怪的行为,明显的解决方法是使用@*[local-name() = 'ext:qtip']。要使这种跨浏览器友好且符合标准,请使用:

//h4[@*
    [local-name() = 'ext:qtip' 
    or (local-name() = 'qtip' 
        and namespace-uri() = 'fill-in-proper-ns-uri'
    )]
    [.="DRIVE_20150917-162707"]

答案 1 :(得分:0)

问题在于冒号(&#34;:&#34;)字符。 使用css选择器,你可以找到

h4[ext\:qtip~=DRIVE_20150917-162707]

答案 2 :(得分:0)

这里提到的xpath非常适合我

// [@ [本地名称()=&#39; EXT:qtip&#39;] [=&#39;暂时&#39;]]。这个xpath用于