выполнить Javascript в htmlUnit

Я пытаюсь выполнить javascript с помощью htmlUnit. После выполнения javascript я хочу проверить, были ли на странице какие-либо изменения из-за выполнения javascript. то есть я хочу сравнить html-страницу до и после выполнения javascript...

Любые идеи, как я могу это сделать...

Вот пример кода, объясняющий, что я на самом деле намерен сделать...

public static void main(String[] args) {
    final WebClient webClient = new WebClient();

    HtmlPage page;
    try {
        page = webClient
                .getPage("http://www.somepage.com");
        System.out.println(page.asXml());
        System.out.println(page.getByXPath("//script"));

        BufferedInputStream buffer = null;
        // System.out.print("getWebSite " + urlValue + "\n");

        URL url = new URL(
                "http://www.somepage.com/someJS.js");
        HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
        buffer = new BufferedInputStream(urlc.getInputStream());

        StringBuilder builder = new StringBuilder();
        int byteRead;
        while ((byteRead = buffer.read()) != -1)
            builder.append((char) byteRead);

        buffer.close();

        ScriptResult result = page.executeJavaScript(builder.toString());
        Object jsResult = result.getJavaScriptResult();

        HtmlPage afterExecution = (HtmlPage) result.getNewPage();

        System.out.println(afterExecution.asXml());

    } catch (FailingHttpStatusCodeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

person irbash    schedule 25.11.2011    source источник
comment
Является ли htmlUnit проблемой или сравнением?   -  person Rob Fox    schedule 25.11.2011


Ответы (1)


«Выполнение» исходного кода Javascript ничего не даст. Я ожидаю, что вы получите очень мало от result.getNewPage(). Попробуйте изменить пример, чтобы он попал на реальный сайт, и объясните, какой результат вы ожидаете увидеть, после чего мы сможем попробовать выполнить ваш пример.

Тем не менее, одна вещь, которая может вам помочь, — это думать о HtmlUnit как о браузере, которым вы управляете через Java. Вы не «запускаете» Javascript на странице, его запускает HtmlUnit. Вы притворяетесь, что являетесь пользователем-человеком, нажимающим на вещи, но вы делаете «нажатие» с помощью кода Java.

В вашем примере вы должны перемещаться по DOM в своем page, чтобы найти что-то, что вы используете для запуска Javascript, например, нажав кнопку или изображение. Результат вызова click() даст вам новую страницу, полученную в результате того, что сделал Javascript.

person Rodney Gitzel    schedule 25.11.2011
comment
Привет Родни, Спасибо за ответ. Да, я понимаю, что htmlUnit — это безголовый java-браузер, и мне нужно вызывать события click() и другие события для выполнения javascript. Что я в основном хочу сделать, так это то, что на веб-сайтах обычно есть много javascripts, включенных в них с использованием тега ‹script›. Я хочу знать, действительно ли эти javascripts используются страницей или нет. Итак, учитывая страницу, я хочу проверить, использует ли она все включенные в нее javascripts. Можно ли это сделать с помощью htmlUnit? Использую ли я правильный инструмент? Пожалуйста, предложите мне, если есть лучшие способы сделать это. Спасибо, Ирфан - person irbash; 26.11.2011
comment
Как и любой браузер, HtmlUnit выполнит любое найденное содержимое ‹script›, а затем будет ждать взаимодействия с пользователем, чтобы активировать Javascript. Я не знаю, что сам HtmlUnit позволит вам программно проверить, срабатывает ли какой-то конкретный фрагмент кода (кажется, я припоминаю, что делал именно это через отладчик, думаю, это было довольно уродливо), но в библиотеке JS могут быть некоторые ловушки. HtmlUnit использует. Хотя, наверное, нет. Может быть вам поможет отладчик Firebug JS? - person Rodney Gitzel; 28.11.2011