HtmlUnitでフォームにfireEvent
送信でき、投稿されることを知っています。しかし、JavaScriptを無効にして、組み込み関数を使用してフォームを投稿したい場合はどうなりますか?
Javadocを確認しましたが、これを行う方法が見つかりませんでした。 HtmlFormにそのような関数がないのは不思議です...
Htmlunitページのjavadocとチュートリアルを読み、getInputByName()
を使用してクリックできることを知っています。ただし、送信タイプボタンがないフォームや、そのようなボタンはあるが名前属性がないフォームが存在する場合があります。
私はそのような状況で助けを求めています、これが私がfireEvent
を使用している理由ですが、それは常に機能するとは限りません。
「一時的な」送信ボタンを使用できます。
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();
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);
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();
}
組み込みの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();
この質問には適切で実用的な回答がありますが、実際のユーザーの行動をうまくエミュレートしているものはないようです。
考えてみてください:クリックするボタンがない場合、人間は何をしますか?簡単です。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を介してフォームを送信することは、別のテストケースになる可能性があります。
あなたがそれを理解したとき、他の答え(そしてもちろんこれ)からあなたのフォームを提出する適切な方法を選んでください。