Доступ к HTML, сгенерированному Javascript, с помощью htmlunit -Java - PullRequest
11 голосов
/ 03 июня 2010

Я пытаюсь протестировать веб-сайт, который использует JavaScript для отображения большей части HTML. С браузером HTMLUNIT, как вы сможете получить доступ к HTML, сгенерированному JavaScript? Я просматривал их документацию, но не знал, какой может быть лучший подход.

WebClient webClient = new WebClient();
HtmlPage currentPage = webClient.getPage("some url");
String Source = currentPage.asXml();
System.out.println(Source);

Это простой способ вернуть html страницы, но вы бы использовали domNode или другой способ доступа к html, сгенерированному javascript?

Ответы [ 2 ]

9 голосов
/ 27 апреля 2013

Вы должны дать время для выполнения JavaScript.

Проверьте пример рабочего кода ниже. bucket div s не в исходном источнике.

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

public class GetPageSourceAfterJS {
    public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
        java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); /* comment out to turn off annoying htmlunit warnings */
        WebClient webClient = new WebClient();
        String url = "http://www.futurebazaar.com/categories/Home--Living-Luggage--Travel-Airbags--Duffel-bags/cid-CU00089575.aspx";
        System.out.println("Loading page now: "+url);
        HtmlPage page = webClient.getPage(url);
        webClient.waitForBackgroundJavaScript(30 * 1000); /* will wait JavaScript to execute up to 30s */

        String pageAsXml = page.asXml();
        System.out.println("Contains bucket? --> "+pageAsXml.contains("bucket"));

        //get divs which have a 'class' attribute of 'bucket'
        List<?> buckets = page.getByXPath("//div[@class='bucket']");
        System.out.println("Found "+buckets.size()+" 'bucket' divs.");

        //System.out.println("#FULL source after JavaScript execution:\n "+pageAsXml);
    }
}

Выход:

Loading page now: http://www.futurebazaar.com/categories/Mobiles-Mobile-Phones/cid-CU00089697.asp‌​x?Rfs=brandZZFly001PYXQcurtrayZZBrand
Contains bucket? --> true
Found 3 'bucket' divs.

Используемая версия HtmlUnit:

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.12</version>
</dependency>
1 голос
/ 03 июня 2010

Если предположить, что проблема заключается в HTML, сгенерированном JavaScript в результате вызовов AJAX, вы пробовали раздел "AJAX не работает" в HtmlUnit FAQ ?

В разделе также есть раздел о том, как использовать HtmlUnit с JavaScript .

Если на ваш вопрос здесь нет ответа, я думаю, нам понадобятся дополнительные подробности, чтобы помочь.

...