Проблема с обновлением полей после 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;
}
Буду очень благодарен за любые идеи по решению этой проблемы.