Comment charger en ajax avec interface htmlunit?
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
public class YoutubeBot {
private static final String YOUTUBE = "http://www.youtube.com";
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
WebClient webClient = new WebClient();
webClient.setThrowExceptionOnScriptError(false);
//This is equivalent to typing youtube.com to the adress bar of browser
HtmlPage currentPage = webClient.getPage("http://www.youtube.com/results?search_type=videos&search_query=official+music+video&search_sort=video_date_uploaded&suggested_categories=10%2C24&uni=3");
//Get form where submit button is located
HtmlForm searchForm = (HtmlForm) currentPage.getElementById("masthead-search");
//Get the input field.
HtmlTextInput searchInput = (HtmlTextInput) currentPage.getElementById("masthead-search-term");
//Insert the search term.
searchInput.setText("java");
//Workaround: create a 'fake' button and add it to the form.
HtmlButton submitButton = (HtmlButton) currentPage.createElement("button");
submitButton.setAttribute("type", "submit");
searchForm.appendChild(submitButton);
//Workaround: use the reference to the button to submit the form.
HtmlPage newPage = submitButton.click();
//Find all links on page with given class
final List<HtmlAnchor> listLinks = (List<HtmlAnchor>) currentPage.getByXPath("//a[@class='ux-thumb-wrap result-item-thumb']");
//Print all links to console
for (int i=0; i<listLinks.size(); i++)
System.out.println(YOUTUBE + listLinks.get(i).getAttribute("href"));
}
}
Ce code fonctionne mais je veux juste trier les clips de youtube par exemple par date de téléchargement. Comment faire cela avec interface htmlunit? Je dois cliquer sur le filtre, ce qui devrait charger le contenu par requête ajax et puis j'ai cliquer sur "date de Téléchargement" lien. Je ne connais pas cette première étape, pour charger le contenu ajax. Est-ce possible avec interface htmlunit?
OriginalL'auteur | 2011-07-22
Vous devez vous connecter pour publier un commentaire.
Voici une façon de le faire:
search-lego-refinements
bloc par id.//ul/li/a
lorsque vous démarrez à partir de la précédente id).L'exemple de code suivant montre comment il pourrait être fait:
Vous pouvez simplement parcourir la bonne URL de la requête (
http://www.youtube.com/results?search_type=videos&search_query=nyan+cat&search_sort=video_date_uploaded
).Mais alors vous devez coder votre recherche de paramètre(s) (remplacer les espaces avec
+
par exemple).OriginalL'auteur Jasper
Cela a fonctionné pour moi. Définir cette
Ce serait la cause de tous les appels ajax synchrone.
C'est comment j'ai configurer mon objet WebClient
OriginalL'auteur Varun Tulsian
J'ai joué avec interface htmlunit plus tôt à des fins similaires.
En fait, vous pouvez trouver toutes les informations dont vous avez besoin ici. Interface htmlunit a de l'AJAX activée par défaut, lorsque vous obtenez la
newPage
objet dans votre code, vous pouvez émettre des événements de clic sur la page (trouver l'élément spécifique et l'appeler duclick()
fonction). La partie la plus délicate, c'est que l'AJAX est asynchrone, donc vous devez appelerwait()
ousleep()
après l'exécution virtuel cliquez sur si du code Javascript sur le site puisse traiter les actions. Ce n'est pas la meilleure approche, car l'utilisation du réseau rendsleep()
peu fiables. Vous pouvez trouver quelques chose sur la page qui change lors de l'exécution d'un événement de prise d'appels AJAX (eg. un en-tête de titre change), de sorte que vous pouvez vérifier régulièrement si ce changement a déjà eu lieu sur le site ou pas. (Je dois mentionner qu'il y a un événement resynchronizer intégré à l'interface htmlunit, cependant, je ne parvenais pas à le faire fonctionner comme je l'attendais.) J'utilise Firebug ou Chrome la barre d'outils du développeur de l'examen de la site. Vous pouvez vérifier l'arborescence DOM, avant et après les appels AJAX et de cette façon vous saurez comment faire référence à des contrôles spécifiques (comme des liens et des menus déroulants) sur la page.Je voudrais utiliser XPath pour obtenir des éléments spécifiques, puis, par exemple. vous pouvez faire cela (à partir de code HTML à l'Unité d'exemples):
YouTube fait pas utilise AJAX pour recourir de son résultat. Lorsque vous cliquez sur le tri déroulant sur la page de résultat (ce qui est décoré de la
<button>
) absolue positionné<ul>
montre (ce qui émule le menu déroulant de la partie de la combo) qui a<li>
éléments pour chaque élément de menu.<li>
éléments contiennent une spéciale<span>
élément avec unhref
attribut attaché. Lorsque vous cliquez sur le<span>
élément Javascript navigue le navigateur à cettehref
valeur.Pour eg. dans mon cas, le tri par pertinence
<span>
élément ressemble à ceci:Vous pouvez obtenir la liste de ces portées relativement facilement depuis l'hébergement
<ul>
est le seul enfant de<body>
. Si vous cliquez sur le bouton de la liste déroulante d'abord parce qu'il va créer le<ul>
élément avec tous les childs décrit ci-dessus à l'aide de Javascript. Vous pouvez obtenir le bouton trier par cette XPath:Vous pouvez tester vos requêtes XPath par exemple. droit dans google Chrome, si vous ouvrez les outils de développement et les développeurs de la console à partir de la barre d'outils. Ensuite, vous pouvez tester comme ceci:
Espère que cela vous obtenez la bonne direction.
OriginalL'auteur NagyI
http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork
OriginalL'auteur gis_wild