XPath _relative_ к данному элементу в HTMLUnit / Groovy? - PullRequest
4 голосов
/ 05 июня 2010

Я бы хотел оценить выражение XPath относительно для данного элемент.

Я читал здесь: http://www.w3schools.com/xpath/default.asp

И похоже, что один из приведенных ниже синтаксисов должен работать (особенно если не косая черта или потомок:)

Однако ни один из них не работает в HTMLUnit. Любая помощь высоко ценится (о это отличный сценарий, кстати). Спасибо!

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 ]

2 голосов
/ 05 июня 2010

Из определения проблемы неясно, каков элемент, относительно которого оцениваются выражения 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']
0 голосов
/ 06 июня 2010

Большое спасибо. Видимо, моя ошибка заключалась в использовании одной точки с запятой после потомка, а не двух (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

Doh!

Спасибо!

Misha

...