diff --git b/pom.xml a/pom.xml new file mode 100644 index 0000000..7b0149f --- /dev/null +++ a/pom.xml @@ -0,0 +1,47 @@ + + + + 4.0.0 + + + pl.labno.bernard + htmlunit-sandbox + 1.0-SNAPSHOT + ${project.artifactId} : ${project.version} + Htmlunit sandbox + + pom + + + + + net.sourceforge.htmlunit + htmlunit + 2.8 + + + junit + junit + 4.8.2 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + true + false + + + + + + + + diff --git b/src/test/java/pl/labno/bernard/htmlunified/ScheduleTest.java a/src/test/java/pl/labno/bernard/htmlunified/ScheduleTest.java new file mode 100644 index 0000000..395a95b --- /dev/null +++ a/src/test/java/pl/labno/bernard/htmlunified/ScheduleTest.java @@ -0,0 +1,98 @@ +package pl.labno.bernard.htmlunified; + +import com.gargoylesoftware.htmlunit.BrowserVersion; +import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController; +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.html.HtmlElement; +import com.gargoylesoftware.htmlunit.html.HtmlInput; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import com.gargoylesoftware.htmlunit.html.HtmlSpan; +import com.gargoylesoftware.htmlunit.html.HtmlTableCell; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ScheduleTest { + + // @Test + public void accessEventTitles() throws IOException { + WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6); + //login----------------------------------- + HtmlPage page = (HtmlPage) client.getPage("http://localhost:8080/schoolmanager/view/class/current.seam?networkId=salsafactory"); + ((HtmlInput) page.getElementById("loginForm:email")).setValueAttribute("s4237@pjwstk.edu.pl"); + ((HtmlInput) page.getElementById("loginForm:password")).setValueAttribute("aaaaa"); + HtmlPage oldPage = page; + page = page.getElementById("loginForm:submit").click(); +// This assert would fail (when page redidrects than you need to obtain new page) +// Assert.assertEquals(page,oldPage); + Assert.assertEquals(client.getCurrentWindow().getEnclosedPage(), page); + //---------------------------------------- + + final List titleElements = (List) page.getElementById("results:schedule").getByXPath(".//span[@class='fc-event-title']"); + List titles = new ArrayList(titleElements.size()); + for (HtmlSpan o : titleElements) { + titles.add(o.asText()); + } + Assert.assertEquals(2, titles.size()); + } + + @Test + public void clickSuggestionBox() throws IOException { + WebClient client = new WebClient(BrowserVersion.FIREFOX_3_6); + client.setAjaxController(new NicelyResynchronizingAjaxController()); + //login----------------------------------- + HtmlPage page = (HtmlPage) client.getPage("http://localhost:8080/schoolmanager/view/class/current.seam?networkId=salsafactory"); + ((HtmlInput) page.getElementById("loginForm:email")).setValueAttribute("s4237@pjwstk.edu.pl"); + ((HtmlInput) page.getElementById("loginForm:password")).setValueAttribute("aaaaa"); + HtmlPage oldPage = page; + page = page.getElementById("loginForm:submit").click(); +// This assert would fail (when page redidrects than you need to obtain new page) +// Assert.assertEquals(page,oldPage); + Assert.assertEquals(client.getCurrentWindow().getEnclosedPage(), page); + //---------------------------------------- + final HtmlInput studentInput = (HtmlInput) page.getElementById("searchClass:student_i"); + int initialJobs = client.waitForBackgroundJavaScript(10); + + studentInput.type('w'); + studentInput.type('i'); + Assert.assertEquals(client.getCurrentWindow().getEnclosedPage(), page); +// Here the suggestionBox is still hidden +// System.out.println(page.asXml()); + + int jobs = WebClientUtils.waitForJSJob(client, 0, 30000); +// Here suggestionBox is visible +// System.out.println(page.asXml()); + System.out.println(page.getElementById("searchClass:sS").asXml()); + System.out.println("initialJobs:" + initialJobs); + System.out.println("jobs:" + jobs); + Assert.assertEquals(client.getCurrentWindow().getEnclosedPage(), page); + synchronized (page) { + try { + page.wait(1000); + } catch (InterruptedException e) { + e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. + } + } + Map suggestions = WebClientUtils.getSuggestions(page.getElementById("searchClass:sS"), 0); + Assert.assertEquals(1, suggestions.size()); + System.out.println(suggestions); + HtmlTableCell cell = suggestions.get("Willis Bruce"); + Assert.assertNotNull(cell); + initialJobs = client.waitForBackgroundJavaScript(10); + System.out.println("initial jobs:"+initialJobs); + cell.click(); + System.out.println("Starting jobs:"+client.waitForBackgroundJavaScriptStartingBefore(3000)); + System.out.println("Running jobs:"+client.waitForBackgroundJavaScript(10)); +// studentInput.type('\t'); + jobs = WebClientUtils.waitForJSJob(client,initialJobs, 30000); + System.out.println("initialJobs:" + initialJobs); + System.out.println("jobs:" + jobs); + System.out.println(page.asXml()); + Assert.assertEquals("Willis Bruce",((HtmlElement)page.getByXPath("//*[@id='searchClass:searchStudent']").get(0)).asText()); + } + +} diff --git b/src/test/java/pl/labno/bernard/htmlunified/WebClientUtils.java a/src/test/java/pl/labno/bernard/htmlunified/WebClientUtils.java new file mode 100644 index 0000000..0ff45b3 --- /dev/null +++ a/src/test/java/pl/labno/bernard/htmlunified/WebClientUtils.java @@ -0,0 +1,77 @@ +package pl.labno.bernard.htmlunified; + +import com.gargoylesoftware.htmlunit.WebClient; +import com.gargoylesoftware.htmlunit.html.DomNodeList; +import com.gargoylesoftware.htmlunit.html.HtmlElement; +import com.gargoylesoftware.htmlunit.html.HtmlTableCell; + +import java.util.HashMap; +import java.util.Map; + +public class WebClientUtils { + + private static long defaultCheckInterval = 500; + private static long defaultTimeout = 10000; + + public static long getDefaultCheckInterval() { + return defaultCheckInterval; + } + + public static void setDefaultCheckInterval(long defaultCheckInterval) { + WebClientUtils.defaultCheckInterval = defaultCheckInterval; + } + + public static long getDefaultTimeout() { + return defaultTimeout; + } + + public static void setDefaultTimeout(long defaultTimeout) { + WebClientUtils.defaultTimeout = defaultTimeout; + } + + public static int waitForJSJob(WebClient webClient) { + return waitForJSJob(webClient, webClient.waitForBackgroundJavaScript(10) - 1, defaultCheckInterval, defaultTimeout); + } + + public static int waitForJSJob(WebClient webClient, int initialJobCount) { + return waitForJSJob(webClient, initialJobCount, defaultCheckInterval, defaultTimeout); + } + + public static int waitForJSJob(WebClient webClient, int initialJobCount, long timeout) { + return waitForJSJob(webClient, initialJobCount, defaultCheckInterval, timeout); + } + + public static int waitForJSJob(WebClient webClient, int initialJobCount, long checkInterval, long timeout) { + int jobs; + long startTime = System.currentTimeMillis(); + do { + jobs = webClient.waitForBackgroundJavaScript(checkInterval); + if (startTime + timeout < System.currentTimeMillis()) { + throw new RuntimeException("Number of JavaScript jobs doesn't drop to initial level for 10000 seconds. It's memory leak in your JavaScript rather then request taking so long!"); + } + } while (jobs > initialJobCount); + System.out.println("Waiting took: " + (System.currentTimeMillis() - startTime) + "ms"); + return jobs; + } + + /** + * Returns list of suggestions from rich:suggestionBox + * + * @param suggestion suggestionBox element + * @param column column of suggestionBox to extract text from + * @return list of suggestions + */ + public static Map getSuggestions(HtmlElement suggestion, int column) { + final Map suggestions = new HashMap(); + final HtmlElement suggestElement = suggestion.getElementById(suggestion.getId() + ":suggest"); + @SuppressWarnings("unchecked") + final DomNodeList suggestionRows = suggestElement.getElementsByTagName("tr"); + for (HtmlElement row : suggestionRows) { + @SuppressWarnings("unchecked") + final DomNodeList cells = row.getElementsByTagName("td"); + final HtmlTableCell cell = (HtmlTableCell) cells.get(column + 1); + suggestions.put(cell.asText(), cell); + } + return suggestions; + } +}