Перенаправление HTMLUnit и нажатие кнопки

У меня проблема с HTMLUnit. Вкратце, что я делаю, я заполняю форму и вхожу на веб-страницу, затем нажимаю кнопку на этой странице. На самом деле, я не могу сделать этот процесс, но я пытаюсь. Вот мои исходные коды формы HTML и исходный код Java:

Это с экрана входа:

<form action="/login" method="post"> 
 ...
 <input type="text" name="login_email" id="login_email" value="" />
 <input type="password" name="login_password" id="login_password" />
 <input type="submit" id="login_submit" name="login_submit" value="Sign in" />
</form>

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

Вот мой код Java для входа в систему с использованием этой формы:

Это код из вопроса stackoverflow. Я просто тестирую, не более того.

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

HtmlPage currentPage = webClient.getPage("https://www.blablabla.com:1234");
final HtmlForm form = currentPage.getFirstByXPath("//form[@action='/login']");
HtmlTextInput username = (HtmlTextInput) currentPage.getElementById("login_email");
HtmlPasswordInput password = (HtmlPasswordInput) currentPage.getElementById("login_password");

username.setText("[email protected]");
password.setText("passW0rd");
HtmlButton submitButton = (HtmlButton) currentPage.createElement("button");
submitButton.setAttribute("type", "submit");
form.appendChild(submitButton);

HtmlPage newPage = submitButton.click();

System.out.println(newPage.asText()); 

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

Однако, когда я пытаюсь нажать кнопку на новой странице, я ничего не получаю. На самом деле, я даже не могу нажать на нее, я думаю.

Вот исходный HTML-код моей кнопки и новой веб-страницы:

<form action="auth" method="post">
 <input type="submit" name="allow" value="Allow"/>
</form>

Есть и скрытые входы.

Вот код Java для попытки нажать кнопку с именем «разрешить»:

HtmlButton button = newPage.getElementByName("allow");
HtmlPage page = button.click() ;

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

System.out.println(page.asText());

Но я получаю такие ошибки

начинаются ошибки

WARNING: getElementById(script1338426904717) did a getElementByName for Internet Explorer
31.May.2012 04:15:04 com.gargoylesoftware.htmlunit.javascript.host.ActiveXObject jsConstructor
WARNING: Automation server can't create object for 'ShockwaveFlash.ShockwaveFlash'.
31.May.2012 04:15:04 com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter     runtimeError
SEVERE: runtimeError: message=[Automation server can't create object for     'ShockwaveFlash.ShockwaveFlash'.] sourceName=[https://www.jdkahsjkda/dksajda.js] line=[12]     lineSource=[null] lineOffset=[0]
31.May.2012 04:15:04 com.gargoylesoftware.htmlunit.javascript.host.ActiveXObject     jsConstructor

конец ошибок

Эти ошибки в порядке для меня, пока я могу войти в систему.

Я могу войти и увидеть страницу. В нем говорится что-то вроде «Добро пожаловать, пароль пользователя...» Но я не могу нажать кнопку или сделать что-нибудь еще.

Я надеюсь, что вы, ребята, можете помочь мне с этой проблемой.

Спасибо большое.

Береги себя, и спасибо.

Изменить:

Теперь я получаю эту ошибку:

Exception in thread "main" com.gargoylesoftware.htmlunit.ElementNotFoundException: elementName=[*] attributeName=[name] attributeValue=[allow]
at com.gargoylesoftware.htmlunit.html.HtmlPage.getElementByName(HtmlPage.java:1565)
at cza.main(cza.java:54)

Тем не менее, есть кнопка под названием «разрешить». Я просматриваю исходный код второй страницы и вижу следующее:

<input type="submit" name="allow" value="Allow"/>
<input type="submit" name="deny" value="Deny"/>

Итак, есть кнопка с именем «разрешить» и «запретить». Однако этот код не работает. Может ли это быть из-за JS или чего-то еще? Я попытался найти кнопку отправки на первой странице и отправить форму с ее помощью. Не с поддельной кнопкой, она снова не работает. Я использовал для этого HTMLSubmitInput, он снова терпит неудачу.

Спасибо еще раз.


person John Doe    schedule 31.05.2012    source источник


Ответы (1)


Извините, я пока не могу комментировать...

Что такое newPage.getWebResponse().getContentAsString() содержание? Я предполагаю, что ваша страница может содержать много html-элементов с именем «разрешить».

Лучше всего быть уверенным, что вы получаете уникальный и правильный элемент, есть много способов сделать это:

element.getElementById("id")
page.getFirstByXPath("xpathExpr") || page.getByXPath("xpathExpr")

и так далее... цель действительно состоит в том, чтобы использовать нужный элемент.

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

HtmlForm form = page.getforms(0); 
form.getInputByName("name");
form.getInputByValue("value");

Кстати, несколько советов: инициализируйте веб-клиент с настройками FF следующим образом: client = new WebClient(BrowserVersion.FIREFOX

HtmlForm form = page.getforms(0); 
form.getInputByName("name");
form.getInputByValue("value");
6); он получил лучшее покрытие html-кода ( http://build.canoo.com/htmlunit/artifacts/ )

всегда пытайтесь включить/выключить JS: client.setJavaScriptEnabled(false);client.setThrowExceptionOnScriptError(false);

person maxmax    schedule 01.06.2012
comment
Я изменил код следующим образом: HtmlForm form2 = newPage.getFirstByXPath("//form[@action='authorize']"); HtmlPage finalPage = form2.getButtonByName("allow").click(); И все же он не работает. - person John Doe; 02.06.2012