com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName = [форма] attributeName = [имя] attributeValue = [docSearch] - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь перейти на форму docSearch веб-страницы https://eagletw.mohavecounty.us/treasurer/treasurerweb/search.jsp, используя последнюю версию HTMLUnit (2.37.0). Как вы можете видеть с помощью Firefox DOM Inspector, есть такая форма

WebClient webClient = new WebClient();
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.setRefreshHandler(new RefreshHandler() {
    public void handleRefresh(Page page, URL url, int arg) throws IOException {
        System.out.println("handleRefresh");
    }
});
HtmlPage page = (HtmlPage) webClient.getPage("https://eagletw.mohavecounty.us/treasurer/treasurerweb/search.jsp");
webClient.waitForBackgroundJavaScript(1000000);
webClient.waitForBackgroundJavaScriptStartingBefore(100000);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
page.getEnclosingWindow().getJobManager().waitForJobs(1000000);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.waitForBackgroundJavaScriptStartingBefore(1000000);
HtmlForm form = page.getFormByName("docSearch");  

Последняя строка кода выше дает мне следующее исключение:

com .gargoylesoftware.htmlunit.ElementNotFoundException: elementName = [form] attributeName = [name] attributeValue = [docSearch]

Есть ли какие-либо советы о том, что я могу попробовать в своем коде, чтобы получить форму docSearch? Верите ли вы, что это проблема самого HTMLUnit? Должен ли я подать это как проблему на GitHub сайте HTMLUnit?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Потратьте некоторое время на это, чтобы построить полный образец. Страница доступна только у нас - мне пришлось настроить vpn для доступа к странице. Образец содержит несколько подсказок; надеюсь, что это поможет.

final String url = "https://eagletw.mohavecounty.us/treasurer/treasurerweb/search.jsp";

try (final WebClient webClient = new WebClient()) {
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    // webClient.getOptions().setUseInsecureSSL(true);

    // open the url, this will do a redirect to the login page
    HtmlPage page = webClient.getPage(url);
    // System.out.println(page.asXml());
    // System.out.println("--------------------------------");

    // click the Public User Login
    for (DomElement elem : page.getElementById("middle_left").getElementsByTagName("input")) {
        if (elem instanceof HtmlSubmitInput
                && "Login".equals(((HtmlSubmitInput) elem).getValueAttribute())) {
            page = elem.click();
            break;
        }
    }
    // System.out.println(page.asXml());
    // System.out.println("--------------------------------");

    // search by owner name
    HtmlInput ownerInput = (HtmlInput) page.getElementById("TaxAOwnerIDSearchString");
    ownerInput.type("Trump");
    // click submit
    for (DomElement elem : page.getElementsByTagName("input")) {
        if (elem instanceof HtmlSubmitInput) {
            page = elem.click();
        }
    }
    // System.out.println(page.asXml());
    // System.out.println("--------------------------------");

    System.out.println(page.asText());
0 голосов
/ 10 февраля 2020

Ваш код выглядит действительно отчаянным, обычно лучше попытаться понять, что происходит, чем скопировать каждый фрагмент кода, который вы можете найти в своем коде, и надеяться, что это поможет.

Хорошей отправной точкой является понять, как работает страница. Используйте хороший веб-прокси, такой как Charles (или Fiddler), чтобы отслеживать, что происходит, когда вы открываете страницу в браузере. К сожалению, я не могу открыть ваш URL, потому что мой сервер отчетов браузера не найден. Из-за этого остальная часть этого ответа является скорее догадкой ....

Следующим шагом является создание вашего веб-клиента и попытка жить с настройками по умолчанию.

WebClient webClient = new WebClient();
webClient.getOptions().setThrowExceptionOnScriptError(false);

С эти две линии ваш клиент готов. По крайней мере, установка RefreshHandler полностью нарушает обработку refre sh дел.

Следующим шагом является проверка выходных данных после того, как вы получили страницу, и сравнение с сеансом браузера / веб-прокси.

HtmlPage page = (HtmlPage) webClient.getPage("https://eagletw.mohavecounty.us/treasurer/treasurerweb/search.jsp");
System.out.println(page.asXML());

Нет, вы можете проверить, есть ли форма (в выходных данных) или нет. Если нет, вы должны выяснить с прокси-сервером, есть ли какая-либо перегрузка фона js. Обычно вы будете видеть запросы в своем прокси-выводе.

Чтобы дождаться этого, вы можете вызвать что-то вроде

webClient.waitForBackgroundJavaScriptStartingBefore(100_000);

Иногда эти фоновые задания заменяют содержимое текущего окна. Чтобы позаботиться об этом, неплохо бы получить содержимое текущей страницы из окна перед выводом.

page = page.getEnclosingWindow(getEnclosedPage());
System.out.println(page.asXML());

Надеюсь, это немного прояснит ситуацию. Если вам нужна дополнительная помощь, мне нужен сам доступ к странице. Иначе это только догадки.

...