(うわー、ここで助けを得るのがどれほど難しいか気づきませんでした。誰かがこの質問をより適切に提起できる方法を知っているなら、私は提案を受け入れます)
簡単に言うと、HtmlUnit を使用してページを読み込み、フィールドを変更し、.click() で「送信」ボタンを押します。ただし、サーバーは常に、別のフォームの別のボタンがクリックされた場合に返されるページで応答します。
明らかな答えは、間違ったフォームまたは間違ったボタンを選択しているに違いないということです。しかし、何週間にもわたって、ボタンを選択するために多くの異なるセマンティクスを使用し、多くのテストを行って、それが実際に正しいフォームの正しいボタンであることを確認してきました。
私はこのサイトを何ヶ月も使ってあらゆることを学んできました。しかし、これは私を何週間も困惑させました。
これが、私が作業しようとしている要約された Web ページです。
<HTML>
...
<FORM ACTION="http://www.awebsite.com/search.asp" METHOD="POST">
...
<INPUT TYPE="SUBMIT" VALUE="Go!">
...
</form>
...
<FORM METHOD="POST" ACTION="inventory.asp?a=sd&blindID=252">
...
<INPUT TYPE="Submit" VALUE="Go!">
...
</form>
...
<FORM ACTION="inventory.asp?pg=1&blindID=252&a=c&viewPrices=" METHOD="post">
...
<INPUT TYPE="Submit" VALUE="Submit Changes" onClick="this.disabled=true;this.form.submit()">
...
</form>
...
</HTML>
そして、それを処理するための私のJavaプログラムフラグメント:
// call my own external routine for getting web pages
HtmlPage page = webFetch.fetchWithCookies("http://www.awebsite.com/inventory.asp?blindID="+blindId, validator, filename); // get page with forms on it
// modify an input field
inpPrice = page.getElementByName("newPrice"+item.lotId);
inpPrice.setValueAttribute(item.price.toString());
// submit modified page to server
List<HtmlForm> forms = page.getForms();
HtmlForm form = forms.get(2);
HtmlSubmitInput button = form.getInputByValue("Submit Changes");
HtmlPage page2 = button.click(); // get the server response page
// save the returned page locally so we can look at it
File saveFile = new File("page2.htm");
if (saveFile.exists()) {
saveFile.delete();
}
page2.save(saveFile);
3 番目のフォームが必要ですが、何をしても 2 番目のフォームからの応答が得られます。私が試したこと:
- setJavaScriptEnabled(false); を使用します。オンにすると、理解できない大量のエラーが発生するためです。
- BrowserVersion.FIREFOX_3_6 「ブラウザ」定数はどれも違いを生みません。
- .type('\n'); を使ってみました フォームのフィールド入力の 1 つ。変わりはない。
- 表示されない非表示のフォームがある場合に備えて、リストの最後のフォームを取得していることを確認するために、forms.get(3) を試しました。これにより、適切に IndexOutOfBoundsException エラーが発生し、3 つのフォームのみが取得されたことを示します。
- 最新の Firefox ブラウザーで JavaScript をオフにし、HtmlUnit で達成しようとしているのとまったく同じ手順を実行しようとしました。サーバーは、正しいボタンが押されたかのように、正しい予期されたページを返しました。これは、javascript が不要であることを暗示しているように思われるので、私のトラブルの原因ではありませんか?