我想评估给定的XPath表达式 relative 元件。
我一直在这里读书: http://www.w3schools.com/xpath/default.asp
看起来下面的一种语法应该可以工作(尤其是领先 斜线或后代:)
然而,似乎没有一个在HTMLUnit中起作用。任何帮助非常感谢(哦 这是一个时髦的剧本btw)。谢谢!
http://htmlunit.sourceforge.net/
米莎
#!/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
谢谢!!!
答案 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
卫生署!
谢谢!
米莎