XPath _relative_到HTMLUnit / Groovy中的给定元素?

时间:2010-06-05 14:45:53

标签: xpath groovy htmlunit

我想评估给定的XPath表达式 relative 元件。

我一直在这里读书: http://www.w3schools.com/xpath/default.asp

看起来下面的一种语法应该可以工作(尤其是领先 斜线或后代:)

然而,似乎没有一个在HTMLUnit中起作用。任何帮助非常感谢(哦 这是一个时髦的剧本btw)。谢谢!

http://htmlunit.sourceforge.net/

http://groovy.codehaus.org/

米莎


#!/usr/bin/env groovy

import com.gargoylesoftware.htmlunit.WebClient

def html="""
<html><head><title>Test</title></head>
<body>
<div class='levelone'>
 <div class='leveltwo'>
    <div class='levelthree' />
 </div>
 <div class='leveltwo'>
    <div class='levelthree' />
    <div class='levelthree' />
 </div>
</div>

</body>
</html>
"""

def f=new File('/tmp/test.html')
if (f.exists()) {
 f.delete()
}
def fos=new FileOutputStream(f)
fos<<html

def webClient=new WebClient()
def page=webClient.getPage('file:///tmp/test.html')

def element=page.getByXPath("//div[@class='levelone']")
assert element.size()==1
element=page.getByXPath("div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("/div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("descendant:div[@class='levelone']") // this
gives namespace error
assert element.size()==0

谢谢!!!

2 个答案:

答案 0 :(得分:2)

从问题的定义中不清楚,评估XPath表达式的元素是什么。假设这是文档节点,则以下XPath表达式将选择所需的节点:

   */*/div[@class='levelone']

   html/body/div[@class='levelone']

   descendant::div[@class='levelone']

如果在实际的XML文档(未显示)中存在默认命名空间,则可能会出现问题。在这种情况下,您需要在XPath托管语言中定义/注册此命名空间(我不知道groovy)并使用相关的前缀,如下所示:

   */*/x:div[@class='levelone']

   x:html/x:body/x:div[@class='levelone']

   descendant::x:div[@class='levelone']

答案 1 :(得分:0)

非常感谢你。显然我的错误是在后代而不是两个(doh)

之后使用单个分号
#!/usr/bin/env groovy

import com.gargoylesoftware.htmlunit.WebClient

def html="""
<html><head><title>Test</title></head>
<body>
<div class='levelone'>
  <div class='leveltwo'>
     <div class='levelthree' />
  </div>
  <div class='leveltwo'>
     <div class='levelthree' />
     <div class='levelthree' />
  </div>
</div>

</body>
</html>
"""

def f=new File('/tmp/test.html')
if (f.exists()) {
  f.delete()
}
def fos=new FileOutputStream(f)
fos<<html

def webClient=new WebClient()
def page=webClient.getPage('file:///tmp/test.html')

def element=page.getByXPath("//div[@class='levelone']")
assert element.size()==1
element=page.getByXPath("div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("/div[@class='levelone']")
assert element.size()==0
element=page.getByXPath("descendant::div[@class='levelone']")
assert element.size()==1

卫生署!

谢谢!

米莎