Java Charger la page Web et Garder une trace des changements dans HTML


J'essaie de charger la page Web http://www.twitch.tv/NAME_OF_CHANNEL/chat?opentga=1 pour garder une trace d'un chat twitch via le grattage Web. Le seul problème est que chaque fois que quelqu'un tape un message dans le chat, un élément ul est ajouté au code HTML. Ma question est, si je charge la page avec Selenium ou simplement une requête HTTP GET, comment puis-je continuer à obtenir le code mis à jour afin de pouvoir rechercher tous les nouveaux messages de chat envoyés dans le chat?

Voici à quoi ressemble une partie du code comme.

entrez la description de l'image ici

Comme vous pouvez le voir, il existe un élément ul qui a une énorme liste d'éléments div avec des identifiants aléatoires. Dans chacun des éléments div, il y a le message de chat individuel, avec certaines informations comme quel utilisateur l'a envoyé et à quelle heure. Les éléments div sont ce qui continue à être mis à jour, un étant ajouté chaque fois qu'un message est envoyé. Comment puis-je garder une trace de tous les éléments div enregistrant chacun dans une liste chaque fois qu'un message est envoyé? Merci!

Author: FaTal Cubez, 2015-09-07

1 answers

Vous pouvez poll le DOM de votre cas particulier. La signification de polling est de placer le pilote dans un état de moniteur où il attend qu'une condition soit remplie. Vous pouvez avoir soit implicit ou explicit en attente.

Quelque chose comme ça serait une bonne longueur d'avance

public static void main(String[] args) throws Exception {
    WebDriver driver = new FirefoxDriver();
    driver.get("http://www.twitch.tv/NAME_OF_CHANNEL/chat?opentga=1");

    WebDriverWait initialWait = new WebDriverWait(driver, 60);
    WebElement commentsContainer = initialWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("ul.chat-lines")));
    if(commentsContainer == null)
        throw new Exception("Page unresponsive!!!");

    int numberOfComments = commentsContainer.findElements(By.cssSelector("div[id^=ember]")).size() + 1;
    while(true) {
        String newCommentSelector = "chat-lines > div:nth-child(" + numberOfComments + ")";
        WebElement newComment = (new WebDriverWait(driver, 60))
          .until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(newCommentSelector)));
        if(newComment == null) continue;

        numberOfComments++;

        System.out.println(newComment.getText());
    }
}

, Cela pourrait être nettoyé. Il peut y avoir des erreurs, mais la logique est simple.

Vous attendez d'avoir le conteneur des commentaires. Ensuite, vous trouverez tous les commentaires présents à ce stade et d'obtenir leur numéro. Après cela, vous attendez juste que vous" voyiez " le commentaire initial_number_of_comments + 1.

Les sélecteurs peuvent ne pas être corrects. N'hésitez pas à changer à volonté. C'est une boucle de sondage sans fin, donc vous voudrez peut-être introduire une sorte de logique de sortie ici.

 2
Author: alkis, 2015-10-05 21:08:46