web-dev-qa-db-ja.com

HtmlUnit、送信ボタンをクリックせずにフォームを投稿する方法は?

HtmlUnitでフォームにfireEvent送信でき、投稿されることを知っています。しかし、JavaScriptを無効にして、組み込み関数を使用してフォームを投稿したい場合はどうなりますか?

Javadocを確認しましたが、これを行う方法が見つかりませんでした。 HtmlFormにそのような関数がないのは不思議です...


Htmlunitページのjavadocとチュートリアルを読み、getInputByName()を使用してクリックできることを知っています。ただし、送信タイプボタンがないフォームや、そのようなボタンはあるが名前属性がないフォームが存在する場合があります。

私はそのような状況で助けを求めています、これが私がfireEventを使用している理由ですが、それは常に機能するとは限りません。

14
user967639

「一時的な」送信ボタンを使用できます。

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();
41
mirovarga
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);
7
Martin
final HtmlSubmitInput button = form.getInputByName("submitbutton");
final HtmlPage page2 = button.click()

から htmlunit doc

@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();
}
2
Ransom Briggs

組み込みの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();
1
jirislav

この質問には適切で実用的な回答がありますが、実際のユーザーの行動をうまくエミュレートしているものはないようです。
考えてみてください:クリックするボタンがない場合、人間は何をしますか?簡単です。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");notinput.type('\n');と同じであることに注意してください。

これは、JavaScriptの実行を無効にし、使用可能な送信ボタンがない場合に機能します。


[〜#〜] imho [〜#〜]最初にhowフォームを送信します。テストしたいのはどのようなシナリオですか?ユーザーがリターンキーを押すのは、ボタンをクリックする場合とは異なる場合があります(onClickがある場合があります)。また、JavaScriptを介してフォームを送信することは、別のテストケースになる可能性があります。

あなたがそれを理解したとき、他の答え(そしてもちろんこれ)からあなたのフォームを提出する適切な方法を選んでください。

0
m02ph3u5