java 如何在 HtmlUnit 中通过 Xpath 获取元素

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7641885/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 20:48:35  来源:igfitidea点击:

How to get element by Xpath in HtmlUnit

javaxpathhtmlunit

提问by Иван Бишевац

I am trying to search Amazon. I want to choose category, for ex. Books, type some search criteria, for ex. java and to click Go button. My problem is clicking the Go button. I've got exception:

我正在尝试搜索亚马逊。我想选择类别,例如。书籍,输入一些搜索条件,例如。java 并单击 Go 按钮。我的问题是单击 Go 按钮。我有例外:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:571) at java.util.ArrayList.get(ArrayList.java:349) at Bot.clickSubmitButton(Bot.java:77) at Bot.main(Bot.java:111)

线程“main”中的异常 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.rangeCheck(ArrayList.java:571) at java.util.ArrayList.get(ArrayList.java:349) at Bot.clickSubmitButton(Bot.java:77) 在 Bot.main(Bot.java:111)

Here is my code:

这是我的代码:

/**
 * @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();
    }
}

Obvoiusly there is some problem in method clickSumbitButton, in selecting input element inside div. It gives empty array. Would someone help me to solve this problem?

很明显,clickSumbitButton 方法在选择 div 内的输入元素时存在一些问题。它给出了空数组。有人会帮我解决这个问题吗?

Edit: After refactoring method clickImageButton, I have error on line: currentPage = (HtmlPage) button.click(); Here is stack trace:

编辑:重构方法clickImageButton后,我在线出错:currentPage = (HtmlPage) button.click(); 这是堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException at Bot.clickImageButton(Bot.java:81) at Bot.main(Bot.java:114)

线程“main”中的异常 java.lang.NullPointerException at Bot.clickImageButton(Bot.java:81) at Bot.main(Bot.java:114)

回答by Mosty Mostacho

Have you tried?

你有没有尝试过?

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

I would also recommend you to take a look at: getFirstByXPath

我还建议您查看:getFirstByXPath