htmlunit 抓取网页(4.网页测试您可以通过多种方式测试Web应用程序——)

优采云 发布时间: 2022-03-03 00:20

  htmlunit 抓取网页(4.网页测试您可以通过多种方式测试Web应用程序——)

  HtmlUnit简介一、简介

  在本文中,我们将介绍 HtmlUnit,它允许我们使用 JAVA API 以编程方式交互和测试 HTML 站点。

  2.关于 HtmlUnit

  HtmlUnit 是一种无 GUI 浏览器 - 一种旨在以编程方式而不是由用户直接使用的浏览器。

  该浏览器支持 JavaScript(通过 Mozilla Rhino 引擎),甚至可以使用具有复杂 AJAX 功能的 网站。所有这些都可以通过模拟典型的基于 GUI 的浏览器(例如 Chrome 或 Firefox)来完成。

  HtmlUnit 这个名字可能会让你认为它是一个测试框架,但是虽然它绝对可以用于测试,但它可以做的远不止这些。

  它还集成到 Spring 4 中,可以与 Spring MVC 测试框架无缝使用。

  3.下载和Maven依赖

  HtmlUnit 可以从 SourceForge 或官网下载。此外,您可以将其收录在您的构建工具(如 Maven 或 Gradle 等)中,如您在此处所见。例如,以下是您当前可以收录在项目中的 Maven 依赖项:

  

net.sourceforge.htmlunit

htmlunit

2.23

  最新版本可以在这里找到。

  4. 网络测试

  您可以通过多种方式测试 Web 应用程序——其中大部分我们已经介绍过 网站 一次或多次。

  使用 HtmlUnit,您可以直接解析站点的 HTML,通过浏览器与普通用户交互,检查 JavaScript 和 CSS 语法,提交表单,并解析响应以查看其 HTML 元素的内容。所有这一切,都使用纯 Java 代码。

  让我们从一个简单的测试开始:创建一个 WebClient 并获取导航的第一页:

  private WebClient webClient;

@Before

public void init() throws Exception {

webClient = new WebClient();

}

@After

public void close() throws Exception {

webClient.close();

}

@Test

public void givenAClient_whenEnteringBaeldung_thenPageTitleIsOk()

throws Exception {

HtmlPage page = webClient.getPage("/");

Assert.assertEquals(

"Baeldung | Java, Spring and Web Development tutorials",

page.getTitleText());

}

  如果我们的 网站 有 JavaScript 或 CSS 问题,您会在运行测试时看到一些警告或错误。你应该纠正它们。

  有时,如果您知道自己在做什么(例如,如果您发现唯一的错误来自不应修改的第三方 JavaScript 库),您可以通过调用 setThrowExceptionOnScriptError 来防止这些错误使您的测试失败错误的:

  @Test

public void givenAClient_whenEnteringBaeldung_thenPageTitleIsCorrect()

throws Exception {

webClient.getOptions().setThrowExceptionOnScriptError(false);

HtmlPage page = webClient.getPage("/");

Assert.assertEquals(

"Baeldung | Java, Spring and Web Development tutorials",

page.getTitleText());

}

  5.网页抓取

  您不需要仅为您自己的 网站 使用 HtmlUnit。毕竟,它是一个浏览器:您可以使用它浏览您喜欢的任何网页,根据需要发送和检索数据。

  从 网站 获取、解析、存储和分析数据的过程称为网络抓取,HtmlUnit 可以帮助您完成获取和解析部分。

  前面的示例显示了我们如何输入任何 网站 并在其中导航,检索我们想要的所有信息。

  例如,让我们转到 Baeldung 的完整 文章 存档,导航到最新的 文章 并检索其标题(第一个令牌)。对于我们的测试来说,这就足够了;但是,如果我们想存储更多信息,例如,我们还可以检索标题(所有标签)以了解 文章 是什么的基本概念。

  通过 ID 获取元素很容易,但一般来说,如果需要查找元素,使用 XPath 语法会更方便。HtmlUnit 允许我们使用它,所以我们会。

  @Test

public void givenBaeldungArchive_whenRetrievingArticle_thenHasH1()

throws Exception {

webClient.getOptions().setCssEnabled(false);

webClient.getOptions().setJavaScriptEnabled(false);

String url = "/full_archive";

HtmlPage page = webClient.getPage(url);

String xpath = "(//ul[@class='car-monthlisting']/li)[1]/a";

HtmlAnchor latestPostLink

= (HtmlAnchor) page.getByXPath(xpath).get(0);

HtmlPage postPage = latestPostLink.click();

List h1

= (List) postPage.getByXPath("//h1");

Assert.assertTrue(h1.size() > 0);

}

  首先注意如何 - 在这种情况下,我们对 CSS 和 JavaScript 不感兴趣,我们只想解析 HTML 布局,所以我们关闭了 CSS 和 JavaScript。

  在真正的网页抓取中,你可以以 h1 和 h2 标题为例,结果会是这样的:

  Java Web Weekly, Issue 135

1. Spring and Java

2. Technical and Musings

3. Comics

4. Pick of the Week

  您可以检查检索到的信息是否确实对应于 Baeldung 中最新的 文章:

  

  6. AJAX 怎么样?

  AJAX 功能可能是一个问题,因为 HtmlUnit 通常在 AJAX 调用完成之前检索页面。很多时候,您需要他们正确地测试您的 网站 或检索您想要的数据。有一些方法可以处理它们:

  for (int i = 0; i < 20; i++) {

if (condition_to_happen_after_js_execution) {

break;

}

synchronized (page) {

page.wait(500);

}

}

  WebClient webClient = new WebClient(BrowserVersion.CHROME);

  7. 弹簧示例

  如果我们正在测试我们自己的 Spring 应用程序,事情会变得更容易——我们不再需要一个正在运行的服务器。

  让我们实现一个非常简单的示例应用程序:只是一个带有接收文本的方法的控制器和一个带有表单的 HTML 页面。用户可以在表单中输入文本,提交表单,文本会出现在表单下方。

  在这种情况下,我们将为此 HTML 页面使用 Thymeleaf 模板(您可以在此处查看完整的 Thymeleaf 示例):

  @RunWith(SpringJUnit4ClassRunner.class)

@WebAppConfiguration

@ContextConfiguration(classes = { TestConfig.class })

public class HtmlUnitAndSpringTest {

@Autowired

private WebApplicationContext wac;

private WebClient webClient;

@Before

public void setup() {

webClient = MockMvcWebClientBuilder

.webAppContextSetup(wac).build();

}

@Test

public void givenAMessage_whenSent_thenItShows() throws Exception {

String text = "Hello world!";

HtmlPage page;

String url = "http://localhost/message/showForm";

page = webClient.getPage(url);

HtmlTextInput messageText = page.getHtmlElementById("message");

messageText.setValueAttribute(text);

HtmlForm form = page.getForms().get(0);

HtmlSubmitInput submit = form.getOneHtmlElementByAttribute(

"input", "type", "submit");

HtmlPage newPage = submit.click();

String receivedText = newPage.getHtmlElementById("received")

.getTextContent();

Assert.assertEquals(receivedText, text);

}

}

  这里的关键是使用 WebApplicationContext 中的 MockMvcWebClientBuilder 来构建 WebClient 对象。使用 WebClient,我们可以获得导航的第一页(注意它是如何由 localhost 提供的)并从那里开始浏览。

  如您所见,测试解析表单输入消息(在id为“message”的字段中),提交表单,并在新页面上断言接收到的文本(id为“received”的字段)是相同的正如我们提交的文本一样。

  8. 结论

  HtmlUnit 是一个很棒的工具,可以让您轻松地测试您的 Web 应用程序、填写表单字段并提交它们,就像您在浏览器上使用 Web 一样。

  它与 Spring 4 无缝集成,并与 Spring MVC 测试框架一起为您提供了一个非常强大的环境,即使没有 Web 服务器也可以对所有页面进行集成测试。

  此外,使用 HtmlUnit,您可以自动执行任何与网页浏览相关的任务,例如获取、解析、存储和分析数据(网页抓取)。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线