HtmlUnit JavaScript Проблема при загрузке страницы - Не удается найти функцию - PullRequest
0 голосов
/ 14 сентября 2018

Я сканирую веб-сайт, защищенный с помощью Cloudflare, и иногда получаю сообщение об ошибке из-за перенаправления на страницу с помощью ReCapcha, страница не может быть загружена даже из-за какой-либо ошибки JavaScript. В коде #getPage происходит сбой кода, и я понятия не имею, почему.

Вот код, который нормально работает для обычных страниц, но не на странице подтверждения:

final WebClient webClient = new WebClient(BrowserVersion.CHROME);
    webClient.getOptions().setJavaScriptEnabled(true);

    final HtmlPage page = webClient.getPage("https://mydummy.site");

    webClient.waitForBackgroundJavaScript(10000);

    int waitForBackgroundJavaScript = webClient.waitForBackgroundJavaScript(200);
    int loopCount = 0;
    while (waitForBackgroundJavaScript > 0 && loopCount < 2) {
        ++loopCount;
        waitForBackgroundJavaScript = webClient.waitForBackgroundJavaScript(200);
        if (waitForBackgroundJavaScript == 0) {
            break;
        }
    }

Журналы:

java.lang.RuntimeException: com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot find function start in object [object MessagePort]. (https://www.gstatic.com/recaptcha/api2/v1536705955372/recaptcha__en.js#249) (https://www.gstatic.com/recaptcha/api2/v1536705955372/recaptcha__en.js#253)
at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:305)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:539)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:399)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:316)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:467)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:449)
at Main.htmlUnit(Main.java:156)
at Main.main(Main.java:43)
Caused by: com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: Wrapped com.gargoylesoftware.htmlunit.ScriptException: TypeError: Cannot find function start in object [object MessagePort]. (https://www.gstatic.com/recaptcha/api2/v1536705955372/recaptcha__en.js#249) (https://www.gstatic.com/recaptcha/api2/v1536705955372/recaptcha__en.js#253)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:892)
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:616)
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:532)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:772)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:748)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:104)
    at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:992)
    at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:371)
    at com.gargoylesoftware.htmlunit.html.HtmlScript$2.execute(HtmlScript.java:246)
    at com.gargoylesoftware.htmlunit.html.HtmlPage.initialize(HtmlPage.java:298)

1 Ответ

0 голосов
/ 16 октября 2018

Мы тоже боролись с этой проблемой.Наш тестовый набор работал отлично до конца 2018 года, когда эта проблема сломала все наши логины.Я полагаю, что Google намеренно использовал это, чтобы сломать автоматические попытки взломать капчи, потому что решение одной части этого может привести только к другой проблеме.И загрузка страницы, и отправка страницы вызывают проблемы, даже если вы скажете HtmlUnitDriver - игнорировать все ошибки JavaScript .

На этом этапе я пробовал несколько вариантов.Если вы используете указанный Google тестовый ключ сайта , ошибки исчезнут.Так что если у вас есть полный серверный контроль над тем, как генерируется этот ключ сайта, все в порядке.Не забудьте убедиться, что ключ тестового сайта снова появляется при ошибках валидации и во всех подобных случаях использования, в противном случае вы получите эту ошибку.

(К сожалению, для нас страница входа в систему является простой JSP, и поэтому ее реализацияголовная боль, если мы не хотим менять URL везде. Все еще обсуждаем, что делать, потому что сейчас у нас есть работоспособное, но уродливое решение, которое включает некоторую условную логику на странице и перехватывает исключения JavaScript в других точках тестового кода.)

...