Htmlunit 使用表示例
2017-08-30 00:00
302 查看
第一组示例将使用这个简单的html。
此示例显示如何遍历所有行和单元格
以下示例显示如何按行和列访问特定单元格
HtmlTableHeader,HtmlTableFooter和HtmlTableBody部分是行的分组。最多可以有一个页眉和一个页脚,但可能有多个主体。它们中的每一个都包含可以通过getRows()访问的行
每个表可以可选地具有描述它的字幕元素。
假设你有以下页面:
您可以使用以下代码获取two.html的内容:
要获取第一帧的页面(左上角),然后单击第六个链接:
要获取名为“packageFrame”的框架的页面(位于左下方),然后单击第二个链接:
要获取名为“classFrame”的框架的页面(右侧):
当首次实例化WebClient时,会自动创建TopLevelWindow。您可以将其视为Web浏览器显示的第一个窗口。调用WebClient.getPage(WebWindow,WebRequest)会将新页面加载到此窗口中。
JavaScript open()函数可用于将页面加载到其他窗口中。此功能将自动创建新的WebWindow对象。
当通过JavaScript或WebClient打开窗口时,WebWindowEvent将被触发并传递到WebWindowListener.webWindowOpened(WebWindowEvent)方法中。请注意,事件中的新旧页面将为null,因为此时窗口中没有加载任何内容。如果在创建窗口期间指定了一个URL,则页面将被加载,另一个事件将被触发,如下所述。
当新页面加载到特定的窗口中时,WebWindowEvent将被触发并传递到WebWindowListener.webWindowContentChanged(WebWindowEvent)方法中。
通常,你应该wait()或sleep()有一点,因为HtmlUnit可以在从服务器检索到AJAX响应之前完成,请阅读这个FAQ。
以下是一些例子:
我们可能想测试五个文本字段是否被创建,以便我们可以从这开始。
我们也可能要确保它不会创建“textfield0”或“textfield6”来检查一个一个的错误。尝试获取不存在的元素将导致抛出异常,所以我们可以将其添加到上一个测试的结尾。
警报由AlertHandler跟踪,每当调用JavaScript alert()函数时,它将被调用。在下面的测试中,我们注册一个警报处理程序,它将所有消息保存到列表中。当页面加载完成后,我们将收集的警报列表与预期警报的另一个列表进行比较,以确保它们相同。
如果您希望测试的事件尚未被支持,那么您可以通过ScriptEngine直接调用它。请注意,虽然脚本引擎是可公开访问的,但我们不建议直接使用它,除非您没有其他选择。通过点击元素并转移焦点,操作页面会更好。
Windows上的Internet Explorer可以运行任意ActiveX组件(如果用户信任网站,则安全级别有目的降低)。HtmlUnit和Internet Explorer都不能控制运行ActiveX的行为,所以在使用该功能之前必须要小心。
当前的实现取决于Jacob,并且由于它具有.dll依赖关系,所以没有上传到maven仓库。依赖是可选的,即Jacob jar不需要编译或通常使用HtmlUnit。
要使用Jacob,请将jacob.jar添加到类路径中,并将.dll放在路径(java.library.path)中,以便以下代码适用于您:
<html><head><title>Table sample</title></head><body> <table id="table1"> <tr> <th>Number</th> <th>Description</th> </tr> <tr> <td>5</td> <td>Bicycle</td> </tr> </table> </body></html>
此示例显示如何遍历所有行和单元格
HtmlTable table = page.getHtmlElementById("table1"); for (HtmlTableRow row : table.getRows()) { System.out.println("Found row"); for (HtmlTableCell cell : row.getCells()) { System.out.println(" Found cell: " + cell.asText()); } }
以下示例显示如何按行和列访问特定单元格
WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage("http://foo.com"); HtmlTable table = page.getHtmlElementById("table1"); System.out.println("Cell (1,2)=" + table.getCellAt(1,2));
更复杂的表
下面的例子将使用一个更复杂的表,其中包括表头,页脚和主体部分以及标题<html><head><title>Table sample</title></head><body> <table id="table1"> <caption>My complex table</caption> <thead> <tr> <th>Number</th> <th>Description</th> </tr> </thead> <tfoot> <tr> <td>7</td> <td></td> </tr> </tfoot> <tbody> <tr> <td>5</td> <td>Bicycle</td> </tr> </tbody> <tbody> <tr> <td>2</td> <td>Tricycle</td> </tr> </tbody> </table> </body></html>
HtmlTableHeader,HtmlTableFooter和HtmlTableBody部分是行的分组。最多可以有一个页眉和一个页脚,但可能有多个主体。它们中的每一个都包含可以通过getRows()访问的行
HtmlTableHeader header = table.getHeader(); List<HtmlTableRow> headerRows = header.getRows(); HtmlTableFooter footer = table.getFooter(); List<HtmlTableRow> footerRows = footer.getRows(); for (HtmlTableBody body : table.getBodies()) { List<HtmlTableRow> rows = body.getRows(); }
每个表可以可选地具有描述它的字幕元素。
String caption = table.getCaptionText()
使用框架:
示例1
通过使用HtmlPage.getFrames(),可以在<frame>元素或<iframe>元素中获取页面。假设你有以下页面:
<html> <body> <iframe src="two.html"> </body> </html>
您可以使用以下代码获取two.html的内容:
List<FrameWindow> window = page.getFrames(); HtmlPage pageTwo = (HtmlPage) window.get(0).getEnclosedPage();
示例2
另一个导航API文档以获取类的所需页面的示例:WebClient client = new WebClient(); HtmlPage mainPage = client.getPage("http://htmlunit.sourceforge.net/apidocs/index.html");
要获取第一帧的页面(左上角),然后单击第六个链接:
HtmlPage packageListPage = (HtmlPage) mainPage.getFrames().get(0).getEnclosedPage(); packageListPage.getAnchors().get(5).click();
要获取名为“packageFrame”的框架的页面(位于左下方),然后单击第二个链接:
HtmlPage pakcagePage = (HtmlPage) mainPage.getFrameByName("packageFrame").getEnclosedPage(); pakcagePage.getAnchors().get(1).click();
要获取名为“classFrame”的框架的页面(右侧):
HtmlPage classPage = (HtmlPage) mainPage.getFrameByName("classFrame").getEnclosedPage();
使用Window
所有页面都包含在WebWindow对象中。这可以是表示实际浏览器窗口的TopLevelWindow,表示<frame>元素的HtmlFrame或表示<iframe>元素的HtmlInlineFrame。当首次实例化WebClient时,会自动创建TopLevelWindow。您可以将其视为Web浏览器显示的第一个窗口。调用WebClient.getPage(WebWindow,WebRequest)会将新页面加载到此窗口中。
JavaScript open()函数可用于将页面加载到其他窗口中。此功能将自动创建新的WebWindow对象。
WebWindowEvents
如果希望在Windows创建或页面加载时收到通知,则需要通过WebClient.addWebWindowListener(WebWindowListener)方法向WebClient注册WebWindowListener。当通过JavaScript或WebClient打开窗口时,WebWindowEvent将被触发并传递到WebWindowListener.webWindowOpened(WebWindowEvent)方法中。请注意,事件中的新旧页面将为null,因为此时窗口中没有加载任何内容。如果在创建窗口期间指定了一个URL,则页面将被加载,另一个事件将被触发,如下所述。
当新页面加载到特定的窗口中时,WebWindowEvent将被触发并传递到WebWindowListener.webWindowContentChanged(WebWindowEvent)方法中。
使用JavaScript
介绍
我们得到的一个常见问题是“我如何测试我的JavaScript?”。没有什么真正具体使用JavaScript,它被自动处理。所以,你只需要.getPage(),找到要单击()的元素,然后检查结果。HtmlUnit测试基础中包含复杂JavaScript库的测试,您可以在这里找到它 , 这对于获取想法是有用的。通常,你应该wait()或sleep()有一点,因为HtmlUnit可以在从服务器检索到AJAX响应之前完成,请阅读这个FAQ。
以下是一些例子:
示例:使用Document.write()
让我们说,我们有一个包含JavaScript的页面,它将动态地将内容写入页面。以下html将动态生成五个文本框,并将它们放在表格中。每个文本框都将通过将索引附加到字符串“textfield”创建的唯一名称。<html><head><title>Table sample</title></head><body> <form action='/foo' name='form1'> <table id="table1"> <script type="text/javascript"> for (i = 1; i <= 5; i++) { document.write("<tr><td>" + i + "</td><td><input name='textfield" + i + "' type='text'></td></tr>"); } </script> </table></form> </body></html>
我们可能想测试五个文本字段是否被创建,以便我们可以从这开始。
@Test public void documentWrite() throws Exception { final WebClient webClient = new WebClient(); final HtmlPage page = webClient.getPage("http://myserver/test.html"); final HtmlForm form = page.getFormByName("form1"); for (int i = 1; i <= 5; i++) { final String expectedName = "textfield" + i; Assert.assertEquals( "text", form.<HtmlInput>getInputByName(expectedName).getTypeAttribute()); } }
我们也可能要确保它不会创建“textfield0”或“textfield6”来检查一个一个的错误。尝试获取不存在的元素将导致抛出异常,所以我们可以将其添加到上一个测试的结尾。
try { form.getInputByName("textfield0"); fail("Expected an ElementNotFoundException"); } catch (final ElementNotFoundException e) { // Expected path } try { form.getInputByName("textfield6"); fail("Expected an ElementNotFoundException"); } catch (final ElementNotFoundException e) { // Expected path }
示例:看“警报”
通常你想观看由JavaScript触发的警报。<html><head><title>Alert sample</title></head> <body onload='alert("foo");'> </body></html>
警报由AlertHandler跟踪,每当调用JavaScript alert()函数时,它将被调用。在下面的测试中,我们注册一个警报处理程序,它将所有消息保存到列表中。当页面加载完成后,我们将收集的警报列表与预期警报的另一个列表进行比较,以确保它们相同。
@Test public void alerts() throws Exception { final WebClient webClient = new WebClient(); final List collectedAlerts = new ArrayList(); webClient.setAlertHandler(new CollectingAlertHandler(collectedAlerts)); // Since we aren't actually manipulating the page, we don't assign // it to a variable - it's enough to know that it loaded. webClient.getPage("http://tciludev01/test.html"); final List expectedAlerts = Collections.singletonList("foo"); Assert.assertEquals(expectedAlerts, collectedAlerts); }
提示,确认和状态行消息
处理提示对话框,确认对话框和状态行消息的工作方式与警报相同。您注册一个适当类型的处理程序,并在调用该方法时收到通知。有关这些的详细信息,请参阅WebClient.setPromptHandler(),WebClient.setConfirmHandler()和WebClient.setStatusHandler()。事件处理程序
大多数事件处理程序已经实现:onload,onclick,ondblclick,onmouseup,onsubmit,onreadystatechange,...它们将在适当的时候触发,就像在“真正的浏览器”中一样。如果您希望测试的事件尚未被支持,那么您可以通过ScriptEngine直接调用它。请注意,虽然脚本引擎是可公开访问的,但我们不建议直接使用它,除非您没有其他选择。通过点击元素并转移焦点,操作页面会更好。
使用ActiveX:
虽然HtmlUnit是一个模拟浏览器的纯Java实现,但在某些情况下,特定于平台的功能需要集成其他库,ActiveX是其中之一。
Windows上的Internet Explorer可以运行任意ActiveX组件(如果用户信任网站,则安全级别有目的降低)。HtmlUnit和Internet Explorer都不能控制运行ActiveX的行为,所以在使用该功能之前必须要小心。
当前的实现取决于Jacob,并且由于它具有.dll依赖关系,所以没有上传到maven仓库。依赖是可选的,即Jacob jar不需要编译或通常使用HtmlUnit。
要使用Jacob,请将jacob.jar添加到类路径中,并将.dll放在路径(java.library.path)中,以便以下代码适用于您:
ActiveXComponent activeXComponent = new ActiveXComponent("InternetExplorer.Application"); boolean busy = activeXComponent.getProperty("Busy").getBoolean(); System.out.println(busy);
允许HtmlUnit使用ActiveX
唯一需要的是设置WebClient属性:webClient.getOptions().setActiveXNative(true);
相关文章推荐
- HtmlUnit 模拟浏览器以及Cookie使用示例
- PHP命名空间(namespace)的使用基础及示例
- 在ASP.NET 中使用 Unity Application Block – 示例(提供代码下载)
- Kafka的Producer和Consumer的示例(使用java语言)
- PCRE函数简介和使用示例
- PHP不使用内置函数实现字符串转整型的方法示例
- QML中ROW组件的使用方法及示例
- java使用短信设备发送sms短信的示例(java发送短信)
- jquery移除、绑定、触发元素事件使用示例详解
- Android WakeLock使用方法示例代码
- 在ASP.NET 中使用 Unity Application Block – 示例(提供代码下载)
- 戴尔PowerEdge RAID控制卡使用示例(PERC H710P为例)
- slf4j日志组件使用示例
- 【Mybatis】mybatis使用示例
- slf4j日志组件使用示例
- cmake使用示例与整理总结
- Freemarker常用指令使用示例
- c#裁剪图片后使用zxing生成二维码示例分享
- GROUP BY中ROLLUP/CUBE/GROUPING/GROUPING SETS使用示例
- 使用python将mdb数据库文件导入postgresql数据库示例