Der [Intersult] [HtmlClient] ist ein sehr einfacher virtueller Browser. !!!Anwendung Ziel ist der Zugriff auf Web-Seiten durch Programme. Dies ist interessant im Rahmen von Datengewinnung, Ablaufautomatisierungen und Software- und Systemtests. Beim Verwenden des HtmlClient werden immer Page-Objekte zurückgegeben. Die erste Page erhält man beim Aufruf der Methode begin, anschließend wieder bei navigate- oder submit-Aufrufen. Die Page enthält den geparsten HTML-Inhalt, darin kann auf alle HTML-Elemente zugegriffen werden. Entweder über die Seitenhierarchie des DOM oder über XPath-Ausdrücke. Einige Elemente wie Form oder Submit haben spezielle Java-Implementierungen, um einfacher weitere Operationen durchführen zu können. !!!Einbinden und Download Der [HtmlClient] kann aus dem [Intersult Maven Repository] bezogen werden: {{{ <dependency> <groupId>com.intersult</groupId> <artifactId>html</artifactId> <version>1.1</version> </dependency> }}} !!!Beispiel {{{ HtmlClient client = new HtmlClient(new UrlClient()); Page page = client.begin(new MutableURL("http://localhost/"), null, false); Assert.assertNotNull(page); Form form = (Form)page.getElement("//FORM[@id = 'header-login']"); Assert.assertNotNull(form); Input username = (Input)form.getElement(".//INPUT[@name = 'header-login:username']"); Assert.assertNotNull(username); username.setValue("test"); Input password = (Input)form.getElement(".//INPUT[@name = 'header-login:password']"); Assert.assertNotNull(password); password.setValue("test"); Submit submit = (Submit)form.getElement(".//INPUT[@type = 'submit']"); Page home = submit.submit(true); }}} !!!Elementtypen Wenn man eine Page oder ein anderes Element hält, kann man mit der Methode getElement() einen XPath-Ausdruck angeben, um ein anderes Element auf der Seite oder untergeordnetes Element zu finden. Grundsätzlich sind diese vom Java-Typ Element mit Außnahme von einigen Ableitungen davon: ||HTML-Node||Java-Klasse |-|Page |FORM|Form |INPUT|Input |INPUT~[@type = 'submit']|Submit |BUTTON|Submit |A|Link |INPUT~[@type = 'radio'] ~| SELECT|Checked !!Javascript-Test XPath-Ausdrücke erfordern etwas geschick. Wenn man die Entwicklerkonsole des Browsers geöffnet hat, kann man per Console Javascript-Befehle ausführen. Damit kann man auch die XPath-Ausdrücke testen: {{{ document.evaluate("//TD[text() = 'Some Table Cell']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue }}} !!!Servlet Unit Protocol Der [HtmlClient] kann auch mit dem [ServletUnitProtocol] betrieben werden. Damit vermeidet man einen [Application Server] hochzufahren, sowie Sockets und Connections zu öffnen. Dazu fügt man in die [Maven] pom.xml zunächst folgende Einträge hinzu: {{{ <dependency> <groupId>com.intersult</groupId> <artifactId>testing-tomcat7</artifactId> <version>1.1-SNAPSHOT</version> <scope>test</scope> </dependency> <dependency> <groupId>com.intersult</groupId> <artifactId>jsf-workspace</artifactId> <version>1.2-SNAPSHOT</version> <scope>test</scope> </dependency> }}} __Hinweis:__ [com.intersult:testing-tomcat7|TomcatUnitProtocol] enthält automatisch das Testing-Framework [com.intersult:testing|Intersult Testing]. [com.intersult:jsf-workspace|JSF Workspace] sorgt dafür, dass JSF-Komponenten geladen werden können, die noch nicht in eigene JAR-Bibliotheken eingepackt sind. Ein Test kann dann so aussehen: {{{ public class JsfTest { @Test public void test() throws Exception { HtmlClient client = new HtmlClient(); Page page = client.begin(new MutableURL("unit://localhost/faces/index.xhtml", getProtocol()), null, false); Assert.assertNotNull(page); Assert.assertEquals("Hello World!", page.getElement("//H1").getText()); Assert.assertEquals("Text-Tag", page.getElement("//DIV[@id = 'form:test-div']").getText()); } private ServletUnitProtocol getProtocol() { ServletUnitProtocol protocol = new TomcatUnitProtocol(); protocol.setWebXmlFile("src/test/webapp/WEB-INF/web.xml"); return protocol; } } }}}