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-NodeJava-Klasse
-Page
FORMForm
INPUTInput
INPUT[@type = 'submit']Submit
BUTTONSubmit
ALink
INPUT[@type = 'radio'] | SELECTChecked

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 enthält automatisch das Testing-Framework com.intersult:testing. com.intersult: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;
	}
}