htmlUnit не обновляет текстовые поля после продолжительной JavaScript проверки скорости

Проблема с обновлением полей после JavaScript обработки в htmlUnit

Использую htmlUnit версии 2.31 для создания краулера, который проверяет скорость интернета у различных провайдеров. Столкнулся с проблемой - после заполнения формы с адресом и запуска проверки скорости, поля ввода не заменяются на лейблы с результатами.

Вручную на сайте все работает правильно. После ввода адреса появляется всплывающее окно с прогрессом проверки, затем на той же странице показываются доступные скорости интернета для указанного адреса. Адрес отображается в лейблах там, где раньше были поля ввода.

В моем коде с htmlUnit, несмотря на длительное ожидание, поле ввода не заменяется лейблом в контейнере с id=“bandwidth-check-result-container”.

Вот мой код:

public Map<String, Integer> getInternetSpeedByLocation(String postalCode, String cityName, String streetName, String houseNum){
    WebClient browser = null;
    try{
        browser = createWebClient();
        HtmlPage currentPage = browser.getPage("https://example-provider-site.com/speed-check/");

        HtmlTextInput zipCityField = (HtmlTextInput) currentPage.getElementById("location_input_field");
        HtmlHiddenInput zipField = (HtmlHiddenInput) currentPage.getElementById("postal_code_field");
        HtmlHiddenInput cityField = (HtmlHiddenInput) currentPage.getElementById("city_name_field");
        HtmlTextInput streetField = (HtmlTextInput) currentPage.getElementById("street_input");
        HtmlTextInput houseField = (HtmlTextInput) currentPage.getElementById("house_number_input");
        HtmlButton checkButton = (HtmlButton) currentPage.getElementById("speed-check-button");

        zipCityField.setValueAttribute(postalCode + " " + cityName);
        zipCityField.fireEvent(Event.TYPE_INPUT);
        currentPage.getWebClient().waitForBackgroundJavaScriptStartingBefore(1000);
        zipField.setValueAttribute(postalCode);
        cityField.setValueAttribute(cityName);
        streetField.setValueAttribute(streetName);
        houseField.setValueAttribute(houseNum);

        currentPage = checkButton.click();
        currentPage.getWebClient().waitForBackgroundJavaScriptStartingBefore(30000);
        DomElement resultContainer = currentPage.getElementById("bandwidth-check-result-container"); // Тут получаю NULL

        List<DomElement> providerList = currentPage.getByXPath("//div[contains(@class, 'provider-result-item')]");

        Map<String, Integer> speedResults = extractMaxSpeeds(providerList);
        return speedResults;
    }catch(Exception ex){
        ex.printStackTrace();
        return Collections.emptyMap();
    }finally {
        browser.close();
    }
}

public static WebClient createWebClient(){
    WebClient browser = new WebClient(BrowserVersion.FIREFOX_52);
    browser.setRefreshHandler(new WaitingRefreshHandler());
    browser.getOptions().setJavaScriptEnabled(true);
    browser.getOptions().setCssEnabled(false);
    browser.setCssErrorHandler(new SilentCssErrorHandler());
    browser.setAjaxController(new NicelyResynchronizingAjaxController());
    browser.getOptions().setUseInsecureSSL(true);
    browser.getOptions().setRedirectEnabled(true);
    browser.getCookieManager().setCookiesEnabled(true);
    browser.getOptions().setPopupBlockerEnabled(false);
    return browser;
}

Буду очень благодарен за любые идеи по решению этой проблемы.

У меня была похожая проблема с асинхронными обновлениями в htmlUnit. Попробуй заменить waitForBackgroundJavaScriptStartingBefore на waitForBackgroundJavaScript без параметра - он будет ждать завершения всех скриптов. Также добавь проверку готовности элемента через WebDriverWait аналог или простой while цикл с getElementById != null. Еще момент - некоторые сайты используют WebSocket для обновления результатов, что htmlUnit не всегда корректно обрабатывает.

Похоже, что обновление DOM происходит позже, чем ты ожидаешь. Попробуй добавить Thread.sleep() после waitForBackgroundJavaScript или использовать цикл с проверкой элемента каждые несколько секунд. Возможно, стоит также попробовать более новую версию htmlUnit — 2.31 довольно старая уже.