0

我是 Java 新手,需要编写各种 Java 应用程序来进行网页抓取和网页交互。

我开始使用 Selenium,但因为它直接与浏览器交互,所以对我来说并不实用。

我需要执行以下任务: 1. 转到特定 URL 2. 在输入字段中输入邮政编码 3. 单击提交按钮 4. 从特定 div 标签或重新查询页面解析并保存结果。

我正在使用 HTMLUnit 和 Eclipse。我可以通过引用表单和输入名称来访问网页并在输入中输入邮政编码。但是,当我尝试单击提交按钮时,出现 ElementNotFoundException 错误。

下面是如何在页面上实现提交按钮的示例:

type="submit" value="submit" name="submit">输入邮编

这是我的代码的样子:

package htmlunittest;

import java.io.IOException;
import java.net.URL;
import junit.framework.TestCase;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.RefreshHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlButtonInput;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlImage;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class htmlunittest extends TestCase{

@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception 
{

    final WebClient webClient = new WebClient();            
    final HtmlPage startPage = webClient.getPage("http://www.testpage.com");

    final HtmlForm form = (HtmlForm) startPage.getForms().get(2);

 final HtmlTextInput textField = form.getInputByName("address");
  textField.setValueAttribute("my post code");

//throws ElementNotFoundException
  final HtmlSubmitInput button = form.getInputByName("submit");

// Now submit the form by clicking the button and get back the second page.
final HtmlPage page2 = button.click();
System.out.println(page2.getHtmlElementById("mainContent"));

webClient.closeAllWindows();

}
}

有人可以指出我应该如何通过 HTMLUNIT 单击提交按钮的正确方向吗?

谢谢

4

1 回答 1

0

如果没有您尝试获取的整个页面,很难找出为什么它不起作用。

我敢打赌,你没有得到正确的表单,.get(2)顺便说一句,以这种方式获取表单通常是一个坏主意,因为如果目标页面稍微更改其源代码只是为了在该表单之上添加一个表单,你的抓取工具不会再次工作,因为索引会有所不同。

于 2013-04-18T13:49:26.537 回答