HtmlUnit框架:新建窗口与在新窗口打开链接

1. HtmlUnit简介

  HtmlUnit是HtmlUnit是“用于Java程序的无GUI浏览器”。
  它为HTML文档建模,并提供一个API,使您可以调用页面,填写表单,单击链接等,就像在“常规”浏览器中一样。
  它具有相当好的JavaScript支持(正在不断改进),并且即使在非常复杂的AJAX库中也可以工作,根据所使用的配置来模拟Chrome,Firefox或Internet Explorer。它通常用于测试目的或从网站检索信息。
  HtmlUnit不是通用的单元测试框架。它是一种特殊的模拟浏览器以进行测试的方法,旨在用于其他测试框架(如JUnit或TestNG)中。

2. 新建窗口

  HtmlUnit新建窗口,就跟在浏览器中创建新窗口一样,可以新建空白窗口,也可以像->右键->“在新窗口中打开链接”一样打开新窗口。
  那问题来了,为什么要新建窗口?如果不新建窗口,就会在默认创建的唯一窗口中打开新链接,这样就覆盖了原来的页面内容,这对并发访问多个页面非常不利。

2.1 新建空白窗口

val newBlankWindow = webClient.openWindow(null, windowName="这里起一个窗口名称")

2.2 在新窗口中打开链接

val newWindow = webClient.openWindow(URL("在这里填入url"), windowName="这里起一个窗口名称")

3. 获取指定窗口的Page

val webRequest=object : WebRequest(URL(url)) {}
val page = webClient.getPage<HtmlPage>(window, webRequest)

4. 新建WebRequest对象中的问题

  在上面3.小节中,根据HtmlUnit源码,新建WebRequest对象时,URL对象是不可以为空的,如果强行设置为null,就会抛出空指针异常。也就是说必须传入有效的URL对象。如此一来,必须设置访问一个链接才能获取指定窗口的Page,这使得2.2小节中的功能变的没用:反正获取窗口的Page都需要明确指定这个窗口打开某个链接,那我设置的新窗口默认打开的链接还有意义吗?
  由此得出结论:每次新建窗口只需要新建空白窗口,“在新窗口中打开链接”是没有意义而且浪费资源的。

5. 便捷地创建WebRequest和WebWindow对象

//加入这两个函数即可便捷地创建WebRequest和WebWindow对象
fun getWebRequest(url: String) = object : WebRequest(URL(url)) {}

fun WebClient.getNewWindow(windowName: String): WebWindow = this.openWindow(null, windowName)

//创建示例
val webRequest = getWebRequest("填入URL")
val window = webClient.getNewWindow("为新窗口起的名字")

//然后就可以获取这个窗口的Page啦
val page = webClient.getPage<HtmlPage>(window, webRequest)
原文地址:https://www.cnblogs.com/soclear/p/14127479.html