Как программно заполнить веб-форму с помощью JAVA? - PullRequest
1 голос
/ 14 декабря 2009

Мне просто нужна помощь, чтобы заполнить веб-форму программно с помощью . Я использую Apache HttpClient 4.0.1. Форма выглядит так:
Web Form Example

HTML-код выглядит так:

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" <ol>Some tags</ol> <ol> 
Do not show the ticket (pre)view when the user first comes to the "New Ticket" page.

Wait until they hit preview. Ticket Box (ticket fields along with description)</ol> <ol>form action="/tracenvir/newticket" method="post" id="propertyform"--div--input type="hidden" name="__FORM_TOKEN" value="dff95a43ddec5a653627d2c0"</ol>

<ol>input type="text" id="field-summary" name="field_summary" size="70"</ol> <ol>textarea id="field-description" name="field_description" class="wikitext" rows="10" cols="68"</ol> <ol>input type="hidden" name="field_status" value="new" </ol> <ol>

      input type="submit" name="preview" value="Preview" </ol> <ol>

      input type="submit" name="submit" value="Create ticket"</ol>

И есть много других тегов. Вот мой код Java:

DefaultHttpClient client = new DefaultHttpClient();

    client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.BEST_MATCH);

    client.setCookieStore(new BasicCookieStore());


    //**LOG IN**//


    //System.setProperty("javax.net.ssl.trustStore", "/home/rauch/NetBeansProjects/jssecacerts");

    HttpGet login = new HttpGet("http://localhost:8000/tracenvir/login");

    client.getCredentialsProvider().setCredentials(AuthScope.ANY,

            new UsernamePasswordCredentials("rauch", "qwerty"));

И тогда правильно войти ... Я получаю 200 ОК и все хорошо.

    //**POST NewTicket**

    HttpPost post = new HttpPost("http://localhost:8000/tracenvir/newticket");

    List<NameValuePair> formparams = new ArrayList<NameValuePair>();

        formparams.add(new BasicNameValuePair("__FORM_TOKEN", cookies.get(1).getValue()));

        formparams.add(new BasicNameValuePair("field_summary", "Someerror"));

        formparams.add(new BasicNameValuePair("field_descryption","AnyDescryption"));

        formparams.add(new BasicNameValuePair("field_type", "defect"));

        formparams.add(new BasicNameValuePair("field_priority", "major"));

        formparams.add(new BasicNameValuePair("field_milestone", "milestone3"));

        formparams.add(new BasicNameValuePair("field_component", "comp2"));

        formparams.add(new BasicNameValuePair("field_version", "1.0"));

        formparams.add(new BasicNameValuePair("field_keywords", ""));

        formparams.add(new BasicNameValuePair("field_cc", ""));

        formparams.add(new BasicNameValuePair("field_owner", "java server"));

        formparams.add(new BasicNameValuePair("field_status", "new"));

        formparams.add(new BasicNameValuePair("submit", "Create ticket"));

    try {

        UrlEncodedFormEntity entity;

        entity = new UrlEncodedFormEntity(formparams, "UTF-8");

        post.setEntity(entity);

        post.addHeader("Referer","http://localhost:8000/tracenvir/newticket");


        HttpResponse response = client.execute(post);


        System.out.println("Create ticket: "+response.getStatusLine());


        client.getConnectionManager().shutdown();


    } catch(UnsupportedEncodingException ex) {

        ex.printStackTrace();

    } catch(IOException ex) {

        ex.printStackTrace();

    }

И ответы сервера HTTP / 1.0 200 OK . Но этот «Новый билет» не появляется на веб-странице ViewTickets. Если я делаю то же самое с обычным веб-браузером, заполните поля и нажмите кнопку «Создать заявку», все в порядке, и я могу увидеть этот NewTicket на веб-странице ViewTickets. Это то, что браузер генерирует запрос:

__FORM_TOKEN=0856803edd721d8b9592231d&field_summary=fuckingStatusField&field_description=mmm+status&field_type=defect&field_priority=major&field_milestone=milestone1&field_component=component1&field_version=2.0&field_keywords=&field_cc=&field_owner=ubuntu-server&field_status=new&submit=Create+ticket)</ol>

Почему это не работает? По умолчанию я не должен использовать это:

formparams.add(new BasicNameValuePair("__FORM_TOKEN", cookies.get(1).getValue()));</p>

<p>
DefaultHttpClient должен делать это, но это не так. Если я прокомментирую это утверждение, Сервер ответит HTTP / 1.0 400 Bad Request

Что мне нужно сделать, чтобы правильно заполнить эту форму?

Я попытался имитировать браузер: сначала страница GET / newticket, а затем сгенерировать POST-запрос с заголовками, которые генерирует Browser ..... Но программно у меня есть 200 OK с сервера, но этот NewTicket не отображается в списке заявок .

Ответы [ 2 ]

4 голосов
/ 15 декабря 2009
  1. Используйте утилиту захвата пакетов, например Wireshark, для мониторинга http-запросов.

  2. Сравните то, что отправляет браузер, с тем, что отправляет ваш код.

  3. Измените свой код соответствующим образом.

4 голосов
/ 14 декабря 2009

Компоненты Apache Http (или старый HttpClient), Selenium, HtmlUnit - зависит от вашего конкретного случая

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...