Java HtmlUnit form.getInputByValue («Войдите сейчас!»).click();

#java #htmlunit

#java #htmlunit

Вопрос:

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

Но я столкнулся с ошибкой при попытке нажать кнопку отправки для формы входа:

 public static boolean attempt_login(String username, String password) throws ElementNotFoundException, IOException {
        WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
        webClient.setJavaScriptEnabled(false);
        webClient.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(Config.LOGIN_PAGE);
        List<HtmlForm> forms = page.getForms();
        HtmlForm form = null;
        for(HtmlForm f : forms){
            if(f.getId().equals("login_form")){
                form = f;
            }
        }
        if(form == null){
            throw new NullPointerException("Could not find form!");
        }
        form.getInputByName("username").setValueAttribute(username);
        form.getInputByName("password").setValueAttribute(password);

        page = (HtmlPage) form.getInputByValue("Login Now!").click();

        System.out.println(page.asText());
        return false;}
  

Почему-то не удается найти кнопку отправки для входа в систему

 com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[input] attributeName=[value] attributeValue=[Login Now!]
at com.gargoylesoftware.htmlunit.html.HtmlForm.getInputByValue(HtmlForm.java:737)
at domain.Helper.attempt_login(Helper.java:41)
at TesterStartUp.main(TesterStartUp.java:15)
  

Исходный код html:

 <button type="submit" value="Login Now!" onmouseover="this.style.backgroundPosition='bottom';" onmouseout="this.style.backgroundPosition='top';" onclick="return SetFocus();">Login Now!</button>
  

Когда я искал решение в Google, я нашел кое-что об отключении javascript, которое помогло бы. Поэтому я сказал webclient отключить его ( WebClient.setJavaScriptEnabled(false);), но все равно было исключение.

Сначала у меня была такая же проблема с попыткой выбрать форму («login_form»), но был метод, с помощью которого я мог получить список всех форм, а затем просто посмотреть, соответствует ли одна из них списку. Я не смог найти способ обойти это для кнопки отправки, поэтому я надеялся, что кто-то еще знает решение этой проблемы.

Заранее спасибо, сэр Тролль

Ответ №1:

getInputByValue() Метод HtmlUnit, работающий с <form> , будет возвращать только типы HTMLLINPUT, и единственный тип кнопки ввода — HtmlButtonInput — представляет <input type="button"> , а НЕ <button> . Вам нужно будет изменить свой HTML или использовать другой вызов метода HtmlUnit.

Комментарии:

1. Это не моя веб-страница, поэтому я не могу изменить html. Какой метод мне следует использовать? поскольку единственным «уникальным» элементом в кнопке отправки является значение

Ответ №2:

У меня была такая же проблема, которую я решил сам:

При попытке входа с помощью html-модуля сначала проверьте, отображается ли окно входа при нажатии с помощью jquery или нет. Если после нажатия кнопки появляется окно входа / div, то вам необходимо обновить страницу (веб-клиент), чтобы получить доступ к новым элементам ввода

  HtmlPage page = webClient.getPage("https://www.yourwebsite.com/#");
 HtmlAnchor link=page.getElementByName("link");
 link.click();
 page.refresh();
  

Если на вашем сайте есть кнопка вместо ссылки привязки, измените ее на html button, после обновления, возможно, вы сможете найти элемент.

Надеюсь, это поможет и решит вашу проблему