2010-01-25 19 views
2

J'utilise le navigateur sans tête HtmlUnit pour parcourir ce webpage (vous pouvez voir la page Web pour avoir une meilleure compréhension du problème).Problème dans l'API HtmlUnit pour Java (navigateur sans tête)?

je fixer la valeur de sélection pour "1"

http://i45.tinypic.com/14m70up.jpg

par les commandes suivantes

final WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_7); 
    try { 
     // Configuring the webClient 
     webClient.setJavaScriptEnabled(true); 
     webClient.setThrowExceptionOnScriptError(false); 
     webClient.setCssEnabled(true); 
     webClient.setUseInsecureSSL(true); 
     webClient.setRedirectEnabled(true); 
     webClient.setActiveXNative(true); 
     webClient.setAppletEnabled(true); 
     webClient.setPrintContentOnFailingStatusCode(true); 
     webClient.setAjaxController(new NicelyResynchronizingAjaxController()); 

     // Adding listeners 
     webClient.addWebWindowListener(new com.gargoylesoftware.htmlunit.WebWindowListener() { 

      public void webWindowOpened(WebWindowEvent event) { 
       numberOfWebWindowOpened++; 
       System.out.println("Number of opened WebWindow: " + numberOfWebWindowOpened); 
      } 

      public void webWindowContentChanged(WebWindowEvent event) { 
      } 

      public void webWindowClosed(WebWindowEvent event) { 
       numberOfWebWindowClosed++; 
       System.out.println("Number of closed WebWindow: " + numberOfWebWindowClosed); 
      } 
     }); 

     webClient.setWebConnection(new HttpWebConnection(webClient) { 
      public WebResponse getResponse(WebRequestSettings settings) throws IOException { 
       System.out.println(settings.getUrl()); 
       return super.getResponse(settings); 
      } 
     }); 

     CookieManager cm = new CookieManager(); 
     webClient.setCookieManager(cm); 


     HtmlPage page = webClient.getPage("http://www.ticketmaster.com/event/0B004354D90759FD?artistid=1073053&majorcatid=10002&minorcatid=207"); 

     HtmlSelect select = (HtmlSelect) page.getElementById("quantity_select"); 
select.setSelectedAttribute("1", true); 

puis cliqué sur le bouton ci-dessous

http://i50.tinypic.com/a27uv5.jpg

par le suivant g commandes

HtmlButtonInput button = (HtmlButtonInput) page.getElementById("find_tickets_button"); 
HtmlPage captchaPage = button.click(); 
Thread.sleep(60*1000); 
System.out.println("======captcha page======="); 
System.out.println(captchaPage.asXml()); 

mais même après avoir cliqué sur le bouton et attendre 60 secondes par la méthode Thread.sleep(), je reçois le même HtmlPage.

Mais quand je fais la même chose avec un vrai navigateur, je reçois la page contenant CAPTCHA.

Je pense qu'il me manque quelque chose dans le htmlunit.

Q1. Pourquoi ne reçois-je pas la même page (qui contient CAPTCHA) via le navigateur de htmlunit?

+0

donnez le code avec lequel vous créez votre 'webClient' – Bozho

+1

Le paramètre' BROWSER_VERSION' devrait définir l'en-tête User-Agent. Alors peut-être surveiller les en-têtes HTTP envoyés par votre navigateur sur demande, et ceux envoyés par votre application (via un proxy) pour voir la différence. – Bozho

+0

J'ai essayé cela aussi. Tous les en-têtes de requête sont identiques dans les deux cas. –

Répondre

3

Le formulaire Web de cette page nécessite le remplissage de la liste déroulante quantity_select. Vous essayez de le faire dans votre code en supposant que la liste déroulante est un élément select. Cependant, ce n'est plus un élément sélectionné. Essayez d'utiliser Firebug pour inspecter la liste déroulante et vous verrez que JavaScript a remplacé le select par un ensemble complexe d'éléments div imbriqués.

Si vous trouvez comment émuler chaque utilisateur, cliquez sur les divs pour cette liste déroulante inhabituelle, vous devriez être en mesure de soumettre le formulaire.

+0

Ou vous pouvez également essayer d'utiliser firebug pour déterminer ce que le site veut pour le formulaire et l'émuler pour votre requête. Peut être plus facile de passer cette étape parfois :-) – jpswain