Как получить элемент по Xpath в HtmlUnit

#java #xpath #htmlunit

#java #xpath #htmlunit

Вопрос:

Я пытаюсь выполнить поиск в Amazon. Я хочу выбрать категорию, например. Книги, введите некоторые критерии поиска, например. java и нажмите кнопку Перейти. Моя проблема заключается в нажатии кнопки Go. У меня есть исключение:

Исключение в потоке «main» java.lang.Исключение IndexOutOfBoundsException: индекс: 0, Размер: 0 в java.util.ArrayList.rangeCheck(ArrayList.java:571) в java.util.ArrayList.get(ArrayList.java:349) в Bot.clickSubmitButton(Bot.java:77) в Bot.main(Bot.java:111)

Вот мой код:

 /**
 * @author ivan.bisevac
 */

import java.io.IOException;
import java.net.MalformedURLException;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlImageInput;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlOption;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSelect;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;

public class Bot {
    private HtmlPage currentPage;

    public HtmlPage getCurrentPage() {
        return currentPage;
    }

    public Bot() {

    }

    /**
     * Bot constructor
     * 
     * @param pageAddress
     *            Address to go.
     * @throws IOException
     * @throws MalformedURLException
     * @throws FailingHttpStatusCodeException
     */
    public Bot(String pageAddress) throws FailingHttpStatusCodeException,
            MalformedURLException, IOException {
        this();
        this.goToAddress(pageAddress);
    }

    /**
     * 
     * @param pageAddress
     * @throws FailingHttpStatusCodeException
     * @throws MalformedURLException
     *             If pageAddress isn't formatted good (for example, it is just
     *             www.google.com without http://) then this exception is thrown
     * @throws IOException
     */
    public void goToAddress(String pageAddress)
            throws FailingHttpStatusCodeException, MalformedURLException,
            IOException {
        WebClient webClient = new WebClient();
        currentPage = webClient.getPage(pageAddress);
    }

    /**
     * Fills text into input field
     * 
     * @param inputId
     *            <input> tag id
     * @param textValue
     *            Text to fill into input field
     */
    public void setInputValue(String inputId, String textValue) {
        HtmlInput input = (HtmlInput) currentPage.getElementById(inputId);
        input.setValueAttribute(textValue);
    }

    /**
     * 
     * @param buttonId
     *            Button id
     * @throws IOException
     */
    public void clickImageButton(String xpathExpr) throws IOException {
        HtmlImageInput button = (HtmlImageInput) currentPage
                .getFirstByXPath(xpathExpr);
        currentPage = (HtmlPage) button.click();
    }

    /**
     * 
     * @param radioButtonId
     * @param radioButtonOption
     * @throws IOException
     * @throws InterruptedException
     */
    public void selectRadioButton(String radioButtonId, String radioButtonOption)
            throws IOException, InterruptedException {
        final HtmlInput radio = (HtmlInput) currentPage
                .getElementById(radioButtonId);
        radio.click();
        Thread.sleep(10000);
    }

    /**
     * 
     * @param dropListId
     * @param dropListOption
     */
    public void selectDropList(String dropListId, String dropListOption) {
        HtmlSelect select = (HtmlSelect) currentPage.getElementById(dropListId);
        HtmlOption option = select.getOptionByValue(dropListOption);
        select.setSelectedAttribute(option, true);
    }

    public static void main(String[] args) throws IOException {
        Bot bot = new Bot("http://www.amazon.com");
        bot.selectDropList("searchDropdownBox", "search-alias=stripbooks");
        bot.setInputValue("twotabsearchtextbox", "java");
        bot.clickImageButton("//div[@id='navGoButton']/input");
        bot.getCurrentPage().getTitleText();
    }
}
  

Очевидно, что существует некоторая проблема в методе clickSumbitButton при выборе элемента ввода внутри div. Он выдает пустой массив. Кто-нибудь поможет мне решить эту проблему?

Редактировать: после рефакторинга метода clickImageButton у меня в строке ошибка: currentPage = (HtmlPage) button.click(); Вот трассировка стека:

Исключение в потоке «main» java.lang.Исключение NullPointerException в Bot.clickImageButton(Bot.java:81) в Bot.main(Bot.java:114)

Ответ №1:

Вы пробовали?

 bot.clickSubmitButton("//div[@id='navGoButton']/input");
  

Я бы также рекомендовал вам взглянуть на: getFirstByXPath

Комментарии:

1. Я отредактировал свой вопрос. Можете ли вы предложить мне какой-нибудь способ выбора этого ввода изображения?

2. Если button.click() запускает исключение NullPointerException, то кнопка, очевидно, равна нулю. Это означает, что вы не получаете его должным образом. Однако, начиная с кода, который я вижу на Amazon, решение, которое я предоставил, должно работать. Попробуйте отладить его с помощью System.out.println(currentPage.asXml()); потому что вы можете упустить что-то еще (возможно, вы находитесь не на той веб-странице, на которой, по вашему мнению, находитесь)

3. Я не знаю как, но теперь у меня нет исключения. Спасибо.