HtmlUnit, как разместить форму, не нажимая кнопку отправки? - PullRequest
14 голосов
/ 27 сентября 2011

Я знаю, что в HtmlUnit я могу fireEvent отправить форму, и она будет опубликована. Но что, если я отключил JavaScript и хотел бы опубликовать форму, используя встроенную функцию?

Я проверил Javadoc и не нашел способа сделать это. Странно, что в HtmlForm такой функции нет ...


Я прочитал javadoc и руководство на странице htmlunit, и я знаю, что могу использовать getInputByName() и щелкну по нему Однако иногда существуют формы, в которых нет кнопки отправки типа. или даже есть такая кнопка, но без атрибута имени.

Я прошу помощи в такой ситуации, поэтому я использую fireEvent, но это не всегда работает.

Ответы [ 5 ]

41 голосов
/ 28 декабря 2011

Вы можете использовать «временную» кнопку отправки:

WebClient client = new WebClient();
HtmlPage page = client.getPage("http://stackoverflow.com");

// create a submit button - it doesn't work with 'input'
HtmlElement button = page.createElement("button");
button.setAttribute("type", "submit");

// append the button to the form
HtmlElement form = ...;
form.appendChild(button);

// submit the form
page = button.click();
7 голосов
/ 27 ноября 2012
WebRequest requestSettings = new WebRequest(new URL("http://localhost:8080/TestBox"), HttpMethod.POST);

// Then we set the request parameters
requestSettings.setRequestParameters(Collections.singletonList(new NameValuePair(InopticsNfcBoxPage.MESSAGE, Utils.marshalXml(inoptics, "UTF-8"))));

// Finally, we can get the page
HtmlPage page = webClient.getPage(requestSettings);
2 голосов
/ 27 сентября 2011
final HtmlSubmitInput button = form.getInputByName("submitbutton");
final HtmlPage page2 = button.click()

С Документ htmlunit

@Test
public void submittingForm() throws Exception {
    final WebClient webClient = new WebClient();

    // Get the first page
    final HtmlPage page1 = webClient.getPage("http://some_url");

    // Get the form that we are dealing with and within that form, 
    // find the submit button and the field that we want to change.
    final HtmlForm form = page1.getFormByName("myform");

    final HtmlSubmitInput button = form.getInputByName("submitbutton");
    final HtmlTextInput textField = form.getInputByName("userid");

    // Change the value of the text field
    textField.setValueAttribute("root");

    // Now submit the form by clicking the button and get back the second page.
    final HtmlPage page2 = button.click();

    webClient.closeAllWindows();
}
1 голос
/ 01 сентября 2014

Как насчет использования встроенной поддержки JavaScript? Просто отправьте событие в этой форме:

HtmlForm form = page.getForms().get(0);
form.fireEvent(Event.TYPE_SUBMIT);

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

И если отправитель перенаправляет вас на другой сайт, просто свяжите ответ с переменной страницы:

HtmlForm form = page.getForms().get(0);
page = (HtmlPage) form.fireEvent(Event.TYPE_SUBMIT).getNewPage();
0 голосов
/ 11 мая 2018

Хотя на этот вопрос есть хорошие и рабочие ответы, ни один из них, похоже, не очень хорошо имитирует острое поведение пользователя.
Подумайте об этом: что делает человек, когда нет кнопки, которую можно нажать?Просто нажмите Enter (возврат).И вот как это работает в HtmlUnit:

// assuming page holds your current HtmlPage
HtmlForm form = page.getFormByName("yourFormName");
HtmlTextInput input = form.getInputByName("yourTextInputName");
// type something in
input.type("here goes the input");
// now hit enter and get the new page
page = (HtmlPage) input.type('\n');

Обратите внимание, что input.type("\n"); это не так же, как input.type('\n');!

Это работает, когда вы отключилиjavascript exection и когда нет доступной кнопки отправки.


ИМХО вы должны сначала подумать о как вы хотите отправить форму.Какой сценарий вы хотите проверить?Пользователь, нажимающий клавишу возврата, может быть другим случаем, когда нажимается какая-то кнопка (которая может иметь некоторое значение onClick).И отправка формы через JavaScript может быть еще одним тестовым примером.

Когда вы выяснили это, выберите подходящий способ отправки вашей формы из других ответов (и этот, конечно).

...