Как показать все запросы AJAX с HtmlUnit - PullRequest
0 голосов
/ 07 сентября 2018

Я хочу получить список всех сетевых вызовов веб-страницы. Это URL страницы

https://www.upwork.com/o/jobs/browse/?q=Java&sort=renew_time_int%2Bdesc

Если заглянуть в DeveloperConsole-> Network, вы увидите следующий список enter image description here

Это мой код:

public static void main(String[] args) throws IOException {
        final WebClient webClient = configWebClient();
        final List<String> list = new ArrayList<>();
        new WebConnectionWrapper(webClient) {
            @Override
            public WebResponse getResponse(final WebRequest request) throws IOException {
                final WebResponse response = super.getResponse(request);
                list.add(request.getUrl().toString());
                return response;
            }
        };
        webClient.getPage("https://www.upwork.com/ab/find-work/");
        list.forEach(System.out::println); 
    }

    private static WebClient configWebClient() {
        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60);

        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.waitForBackgroundJavaScriptStartingBefore(5_000);
        webClient.waitForBackgroundJavaScript(3_000);
        webClient.getOptions().setCssEnabled(false);
        webClient.getOptions().setRedirectEnabled(true);
        webClient.getOptions().setUseInsecureSSL(false);
        webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getCookieManager().setCookiesEnabled(true);
        webClient.setAjaxController(new AjaxController());
        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.getCookieManager().setCookiesEnabled(true);
        return webClient;
    }

Это вывод

https://www.upwork.com/o/jobs/browse/?q=Java&sort=renew_time_int%2Bdesc
https://www.upwork.com/o/jobs/browse/?q=Java
https://www.upwork.com:443/o/jobs/browse/js/328ecc3.js?4af40b2
https://www.googletagmanager.com/gtm.js?id=GTM-5XK7SV
https://client.perimeterx.net/PXSs13U803/main.min.js
https://assets.static-upwork.com/components/11.4.0/core.11.4.0.air2.min.js
https://assets.static-upwork.com/global-components/@latest/ugc.js
https://assets.static-upwork.com/global-components/@latest/ugc/ugc.6jcmqb32.js
https://www.upwork.com:443/static/jsui/JobSearchUI/assets/4af40b2/js/55260a3.js

Как видите, он не содержит вызовов xhr. Что я делаю не так?

1 Ответ

0 голосов
/ 07 сентября 2018

Ваши вопросы используют два разных URL; надеюсь, что я использовал правильный

  • как упоминалось здесь много раз; .waitForBackground ... методы не являются опциями, вы должны вызывать их ПОСЛЕ вызова некоторых веб-запросов
  • A в AJAX обозначает асинхронный; webClient.getPage () - это вызов синхронизации, что означает, что вам нужно дождаться завершения всего JavaScript,
  • вызов страницы вызывает некоторые ошибки js при использовании HtmlUnit. Возможно, это приведет к неисполнению всего кода javascript на этой странице (все еще есть некоторые функции javascript, не поддерживаемые HtmlUnit (Rhino); любая помощь приветствуется)

    public static void main(String[] args) throws IOException {
        final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60);
        webClient.getOptions().setThrowExceptionOnScriptError(false);
    
        final List<String> list = new ArrayList<>();
    
        new WebConnectionWrapper(webClient) {
            @Override
            public WebResponse getResponse(final WebRequest request) throws IOException {
                final WebResponse response = super.getResponse(request);
                list.add(request.getHttpMethod() + " " + request.getUrl());
                return response;
            }
        };
    
        webClient.getPage("https://www.upwork.com/o/jobs/browse/?q=Java&sort=renew_time_int%2Bdesc");
        webClient.waitForBackgroundJavaScript(10_000);
        list.forEach(System.out::println); 
    }
    
...