HtmlUnit HtmlImageInput.click () не работает? - PullRequest
0 голосов
/ 01 марта 2010

Я новичок в HtmlUnit и у меня возникли проблемы с получением формы для отправки с помощью HtmlImageInput.click (). Когда я вызываю метод, кажется, ничего не происходит, ни отправка формы, ни отправка на сервер, ни что-либо еще, насколько я могу судить. Метод немедленно возвращается, возвращая текущую страницу.

Нет обработчика событий Javascript, прикрепленного к входу изображения. Это просто старый ванильный ввод изображения, ничего особенного не происходит. При загрузке страницы вход изначально отключается, а затем включается, когда пользователь взаимодействует с определенными элементами AJAXy на странице. Но к тому времени, когда я нажимаю на вход, он уже включен, так что я не думаю, что это проблема AJAX.

Кто-нибудь имеет представление о том, что происходит? Запускаемый исходный код вставлен ниже.

Спасибо, Мэтью

import java.io.*;
import java.util.*;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
import org.w3c.dom.*;

public class Test {

public static void main(String args[]) {

    try {
        WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_7);
        webClient.setThrowExceptionOnScriptError(false);
        HtmlPage page = webClient.getPage("http://us.megabus.com");
        System.out.println("got the page");
        HtmlForm form = page.getFormByName("ctl01");
        System.out.println("got the form");
        HtmlSelect select = form.getSelectByName("SearchAndBuy1$ddlLeavingFrom");
        select.click();
        System.out.println("clicked the select");
        HtmlOption option = select.getOptionByValue("13");
        option.click();
        System.out.println("clicked the option...going to sleep");
        try { Thread.sleep(15000); } catch(InterruptedException e) {}
        select = form.getSelectByName("SearchAndBuy1$ddlTravellingTo");
        select.click();
        System.out.println("clicked the select 2");
        option = select.getOptionByValue("37");
        option.click();
        System.out.println("clicked the option 2...going to sleep");
        try { Thread.sleep(15000); } catch(InterruptedException e) {}
        HtmlImage image = (HtmlImage)page.getElementById("SearchAndBuy1_imgOutboundDate");
        image.click();
        System.out.println("clicked the image");
        String month = "April";
        String date = "09";
        HtmlTable table = (HtmlTable)page.getElementById("SearchAndBuy1_calendarOutboundDate");
        HtmlTableRow row = ((HtmlTable)table.getCellAt(0, 0).getChildElements().iterator().next()).getRow(0);
        String monthString = row.getCell(1).getTextContent();
        monthString = monthString.substring(0, monthString.indexOf(' '));
        while(!monthString.equals(month)) {
            row.getCell(2).getChildElements().iterator().next().click();
            System.out.println("clicked to go to the next month");
            try { Thread.sleep(15000); } catch(InterruptedException e) {}
            table = (HtmlTable)page.getElementById("SearchAndBuy1_calendarOutboundDate");
            row = ((HtmlTable)table.getCellAt(0, 0).getChildElements().iterator().next()).getRow(0);
            monthString = row.getCell(1).getTextContent();
            monthString = monthString.substring(0, monthString.indexOf(' '));
        }
        DomNodeList<HtmlElement> aList = table.getElementsByTagName("a");
        for (int i = 0; i < aList.size(); i++) {
            HtmlAnchor anchor = (HtmlAnchor)aList.get(i);
            if (anchor.getAttribute("title").equals(DomElement.ATTRIBUTE_NOT_DEFINED) || anchor.getAttribute("title").equals(DomElement.ATTRIBUTE_VALUE_EMPTY))
                throw new RuntimeException("DomElement ATTRIBUTE_NOT_DEFINED or ATTRIBUTE_VALUE_EMPTY");
            if (anchor.getAttribute("title").equals(month + " " + date)) {
                anchor.click();
                try { Thread.sleep(15000); } catch(InterruptedException e) {}
                break;
            }
        }
        HtmlImageInput imageInput = (HtmlImageInput)page.getElementByName("SearchAndBuy1$btnSearch");
        page = (HtmlPage)imageInput.click();
        System.out.println("clicked search button");

    } catch(FailingHttpStatusCodeException e) {
        e.printStackTrace();
    } catch(IOException e) {
        e.printStackTrace();
    } catch(ElementNotFoundException e) {
        e.printStackTrace();
    } catch(IndexOutOfBoundsException e) {
        e.printStackTrace();
    }
}
}

1 Ответ

0 голосов
/ 19 марта 2010

Это изображение не является полем ввода, это просто старое изображение:

<img id="SearchAndBuy1_imgOutboundDate" disabled="disabled" alt="calendar"
    CausesValidation="False" src="images/icon_calendar.gif" style="border-width:0px;" />

Там не указаны обработчики JS, поэтому они должны быть прикреплены в другом месте, и кажется, что это внизу страницы:

Sys.Application.add_init(function() {
    $create(AjaxControlToolkit.PopupControlBehavior,
       {"PopupControlID":"SearchAndBuy1_panelOutboundDate","Position":3,"dynamicServicePath":"/default.aspx","id":"SearchAndBuy1_pceImageOutboundDate"}, null, null, $get("SearchAndBuy1_imgOutboundDate"));

});

Когда ваша программа нажимает на изображение, отправка формы не выполняется, только вызов AJAX (предположительно), так что вы правы, вы не получите новую страницу обратно. Но, как показывает ваш код (я только что запустил его с помощью отладчика), содержимое HtmlPage изменилось, поскольку теперь оно содержит виджет календаря, из которого вы смогли получить подробности.

Может быть немного странно знать, когда вы получите чистый новый HtmlPage, но обычно это происходит только тогда, когда вы видите в браузере совершенно новую страницу. Я никогда не пробовал HtmlUnit против чего-то вроде Gmail, но я подозреваю, что вы можете когда-либо иметь дело только с одним объектом HtmlPage, и все в нем происходит.

...