2010-12-01 9 views
1

Je suis en train de coder avec Groovy, mais je ne crois pas que ce soit un ensemble de questions spécifiques à une langue.HtmlUnit getByXpath renvoie null

J'ai en fait deux questions

Première question

J'ai rencontré un problème lors de l'utilisation HtmlUnit. Il me dit que ce que j'essaie de saisir est nul.

La page que je teste sur est: http://browse.deviantart.com/resources/applications/psbrushes/?order=9&offset=0#/dbwam4

Mon code:

client = new WebClient(BrowserVersion.FIREFOX_3) 
client.javaScriptEnabled = false 

page = client.getPage(url) 

//coming up as null 
title = page.getByXPath("//html/body/div[4]/div/div[3]/div/div/div/div/div/div/div/div/div/div/h1/a") 

println title 

Cette affiche simplement: []

Est-ce parce que la page utilise onclick()? Si oui, comment pourrais-je contourner cela? L'activation de javascript crée un désordre dans mon invite cmd.

Deuxième question

Je suis désireux d'obtenir aussi l'image, mais je ne parviens parce que quand je tente d'obtenir le XPath (via Firebug), il apparaît comme: // * [@ id = » gmi-ResViewSizer_img "]

Comment gérer cela?

Répondre

1

Première réponse:

/html/body/div[3]/div/div[3]/div/div/div/div/div/div/div/div/div/div/h1/a 

Votre XPATH était hors d'un dans le filtre sous-jacente pour la 4ème div du corps, il devrait être le 3ème div. Il semble que le code HTML du site puisse changer depuis le moment où vous aviez initialement saisi XPATH à l'aide de Firebug. Vous devrez peut-être ajuster votre XPATH pour tenir compte des changements potentiels et être moins sensible à certaines différences dans la structure du document.

Peut-être quelque chose comme ceci:

/html/body//div/h1/a 

Deuxième réponse: XPath que vous avez inscrit fonctionnera. Il peut sembler impair/court (et peut ne pas être le plus efficace), mais // commence au nœud racine et regarde dans chaque nœud de l'arbre, * correspond à n'importe quel élément (pour inclure le img) et le filtre de prédicat [] le restreint à ceux qui ont un attribut id dont la valeur est égale à "gmi-ResViewSizer_img".

Il existe de nombreuses autres options pour XPATH qui pourraient également fonctionner. Cela dépendra également de la fréquence à laquelle la structure HTML change.C'est celui qui fonctionne aussi pour la page référencée pour sélectionner cette img:

/html/body/div/div/div/div/img[1] 
+0

+1 Bonnes explications. –

+0

Merci encore pour l'explication Mads Hansen :) Vous avez été très utile. L'explication est utile, cependant, pour la première réponse, je semble toujours obtenir un retour vide. Je pense qu'il a des problèmes avec le H1 – StartingGroovy

+0

Est-ce que le second XPATH, plus court, fonctionne pour vous? –

0

J'ai eu le même problème, je résolu quand je réalise des balises iframe à la page, essayez appeler

((HtmlPage)current_page.getFrames()[n].getEnclosedPage()).getElementByXPath(... 

où n est la position dans le cadre de la collection iframe. C'est du travail pour moi !!!

Merci beaucoup.

+1

Votre problème portait sur les identificateurs de fragment? – StartingGroovy