Revision: 756 http://jwebunit.svn.sourceforge.net/jwebunit/?rev=756&view=rev Author: jevonwright Date: 2008-10-29 02:08:52 +0000 (Wed, 29 Oct 2008)
Log Message: ----------- issue 1519807: added assertLabeledFieldEquals(id, text) and assertLabel*() methods Modified Paths: -------------- trunk/jwebunit-commons-tests/src/main/java/net/sourceforge/jwebunit/tests/FormAssertionsTest.java trunk/jwebunit-commons-tests/src/main/resources/testcases/FormAssertionsTest/testPage.html trunk/jwebunit-core/src/main/java/net/sourceforge/jwebunit/junit/WebTester.java trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitElementImpl.java trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitTestingEngineImpl.java trunk/src/changes/changes.xml Modified: trunk/jwebunit-commons-tests/src/main/java/net/sourceforge/jwebunit/tests/FormAssertionsTest.java =================================================================== --- trunk/jwebunit-commons-tests/src/main/java/net/sourceforge/jwebunit/tests/FormAssertionsTest.java 2008-10-29 00:24:52 UTC (rev 755) +++ trunk/jwebunit-commons-tests/src/main/java/net/sourceforge/jwebunit/tests/FormAssertionsTest.java 2008-10-29 02:08:52 UTC (rev 756) @@ -257,5 +257,35 @@ assertRadioOptionSelected(option1, "1"); } + + // tests for label elements + public void testLabels() { + beginAt("/testPage.html"); + + assertLabelPresent("label1"); + assertLabeledFieldEquals("label1", "one"); + assertLabelPresent("label2"); + assertLabeledFieldEquals("label2", "two"); + + assertLabelPresent("label3"); + assertLabeledFieldEquals("label3", "three"); + + assertLabelPresent("label4"); + assertLabeledFieldEquals("label4", "2"); + + assertLabelPresent("label5"); + assertLabeledFieldEquals("label5", "2"); + + assertLabelPresent("label6"); + assertLabeledFieldEquals("label6", "ten"); + + assertLabelPresent("label7"); + assertLabeledFieldEquals("label7", "10"); + + assertLabelPresent("label8"); + assertLabeledFieldEquals("label8", "eight"); + + } + } Modified: trunk/jwebunit-commons-tests/src/main/resources/testcases/FormAssertionsTest/testPage.html =================================================================== --- trunk/jwebunit-commons-tests/src/main/resources/testcases/FormAssertionsTest/testPage.html 2008-10-29 00:24:52 UTC (rev 755) +++ trunk/jwebunit-commons-tests/src/main/resources/testcases/FormAssertionsTest/testPage.html 2008-10-29 02:08:52 UTC (rev 756) @@ -55,6 +55,50 @@ </form> </td> </tr> + <tr> + <td colspan="3"> + <h1>Field with labels</h1> + + <label id="label1"> + Field 1: + <input type="text" name="label1_field1" value="one" /> + </label> + <label id="label2"> + Field 2: + <input name="label1_field2" value="two" /> + </label> + <label id="label3"> + <textarea>three</textarea> + </label> + <label id="label4"> + <input type="checkbox" value="1"> Not selected<br /> + <input type="checkbox" value="2" checked>Selected<br /> + </label> + <label id="label5"> + <input type="radio" value="1">Not selected<br /> + <input type="radio" value="2" selected>Selected<br /> + <input type="text" name="label5_field1" value="Ignore this" /> + </label> + <label id="label6"> + <select name="seven" id="label6_seven"> + <option>eight</option> + <option>nine</option> + <option selected>ten</option> + <option>eleven</option> + </select> + </label> + <label id="label7"> + <select name="eight" id="label7_eight"> + <option value="8">eight</option> + <option value="9">nine</option> + <option value="10" selected>ten</option> + <option value="11">eleven</option> + </select> + </label> + <label id="label8" for="input8">Label 8</label> + <input id="input8" type="text" value="eight" /> + </td> + </tr> </table> </body> </html> Modified: trunk/jwebunit-core/src/main/java/net/sourceforge/jwebunit/junit/WebTester.java =================================================================== --- trunk/jwebunit-core/src/main/java/net/sourceforge/jwebunit/junit/WebTester.java 2008-10-29 00:24:52 UTC (rev 755) +++ trunk/jwebunit-core/src/main/java/net/sourceforge/jwebunit/junit/WebTester.java 2008-10-29 02:08:52 UTC (rev 756) @@ -2554,7 +2554,141 @@ public List<IElement> getElementsByXPath(String xpath) { return getTestingEngine().getElementsByXPath(xpath); } + + // label methods + /** + * Assert a label for a given ID exists. + */ + public void assertLabelPresent(String id) { + // get all labels + for (IElement e : getTestingEngine().getElementsByXPath("//label")) { + if (e.getName().equals("label") && id.equals(e.getAttribute("id"))) + return; // label found + } + Assert.fail("No label found with id [" + id + "]"); + } + + /** + * Find a particular element with given text + * + * @param elementName the element type e.g. "input", "label" + * @param text the text to search for + * @return the found element, or null + */ + private IElement getElementWithText(String elementName, String text) { + for (IElement e : getTestingEngine().getElementsByXPath("//" + elementName)) { + if (elementName.equals(e.getName()) && text.equals(e.getTextContent())) { + return e; + } + } + return null; + } + /** + * Assert a label exists. + */ + public void assertLabelMatches(String regexp) { + // get regexp + RE re = null; + try { + re = new RE(regexp, RE.MATCH_SINGLELINE); + } catch (RESyntaxException e) { + Assert.fail(e.toString()); + } + + // get all labels + for (IElement e : getTestingEngine().getElementsByXPath("//label")) { + if (e.getName().equals("label") && re.match( e.getTextContent() )) + return; // label found + } + Assert.fail("No label found with text matching [" + regexp + "]"); + } + + /** + * Private method to test the value of a field connected to a particular IElement label. + * + * @param label + * @param fieldText + */ + private void assertLabeledFieldEquals(String identifier, IElement label, String fieldText) { + List<IElement> fields = new java.util.ArrayList<IElement>(); + // a direct "for" attribute + if (label.getAttribute("for") != null) { + IElement e = getTestingEngine().getElementByID(label.getAttribute("for")); + if (e != null) + fields.add(e); + } + + // implicitly the elements inside the label + if (fields.isEmpty()) { + // get elements inside the label + for (IElement e : label.getChildren()) { + if (e.getName().equals("input") || e.getName().equals("textarea") || e.getName().equals("select")) { + fields.add(e); + } + } + } + + Assert.assertFalse("No field found for label [" + identifier + "]", fields.isEmpty()); + String value = null; + // cycle through all fields trying to find value + for (IElement field : fields) { + if (value != null) // stop at first correct value found + break; + if (field == null) + throw new RuntimeException("unexpected null field " + field); + + if ("input".equals(field.getName())) { + if (field.getAttribute("type") != null) { + if (field.getAttribute("type").toLowerCase().equals("checkbox")) { + if (field.getAttribute("checked") != null) { + value = field.getAttribute("value"); + } + } else if (field.getAttribute("type").toLowerCase().equals("radio")) { + if (field.getAttribute("selected") != null) { + value = field.getAttribute("value"); + } + } else { + // any other input type + value = field.getAttribute("value"); + } + } else { + // unspecified input type, default = text + value = field.getAttribute("value"); + } + } else if ("textarea".equals(field.getName())) { + value = field.getTextContent(); + } else if ("select".equals(field.getName())) { + // get the selected option + for (IElement children : field.getChildren()) { + if (children.getName().equals("option") && children.getAttribute("selected") != null) { + value = children.getAttribute("value") == null ? children.getTextContent() : children.getAttribute("value"); + break; + } + } + } else { + throw new RuntimeException("Unexpected field type " + field.getName()); + } + } + + Assert.assertEquals("value of field for label [" + identifier + "] should be [" + fieldText + "]", fieldText, value); + } + + /** + * Assert that a labeled field exists (for the given id) and the + * field that it labels equals the given text + * + * @param id + * @param fieldText + */ + public void assertLabeledFieldEquals(String id, String fieldText) { + IElement label = getTestingEngine().getElementByID(id); + Assert.assertNotNull("no label for id [" + id + "] found", label); + Assert.assertEquals("element with id [" + id + "] is not a label", "label", label.getName()); + + assertLabeledFieldEquals(id, label, fieldText); + } + // Window and Frame Navigation Methods /** Modified: trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitElementImpl.java =================================================================== --- trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitElementImpl.java 2008-10-29 00:24:52 UTC (rev 755) +++ trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitElementImpl.java 2008-10-29 02:08:52 UTC (rev 756) @@ -26,6 +26,8 @@ private HtmlElement element; public HtmlUnitElementImpl(HtmlElement element) { + if (element == null) + throw new NullPointerException("Cannot create an IElement for a null element."); this.element = element; } @@ -34,6 +36,9 @@ * @see net.sourceforge.jwebunit.api.IElement#attribute(java.lang.String) */ public String getAttribute(String name) { + if (!element.hasAttribute(name)) + return null; + return element.getAttribute(name); } @@ -51,8 +56,10 @@ */ public List<IElement> getChildren() { List<IElement> children = new ArrayList<IElement>(); - for (HtmlElement e : element.getChildElements()) - children.add(new HtmlUnitElementImpl(e)); + for (HtmlElement e : element.getChildElements()) { + if (e != null) + children.add(new HtmlUnitElementImpl(e)); + } return children; } @@ -103,5 +110,9 @@ } return elements; } + + public String toString() { + return "IElement[name=" + getName() + " wrapped=" + element + "]"; + } } Modified: trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitTestingEngineImpl.java =================================================================== --- trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitTestingEngineImpl.java 2008-10-29 00:24:52 UTC (rev 755) +++ trunk/jwebunit-htmlunit-plugin/src/main/java/net/sourceforge/jwebunit/htmlunit/HtmlUnitTestingEngineImpl.java 2008-10-29 02:08:52 UTC (rev 756) @@ -2149,14 +2149,20 @@ * @see net.sourceforge.jwebunit.api.ITestingEngine#getElementByXPath(java.lang.String) */ public IElement getElementByXPath(String xpath) { - return new HtmlUnitElementImpl(this.getHtmlElementByXPath(xpath)); + HtmlElement element = this.getHtmlElementByXPath(xpath); + if (element != null) + return new HtmlUnitElementImpl(element); + return null; } /* (non-Javadoc) * @see net.sourceforge.jwebunit.api.ITestingEngine#getElementByID(java.lang.String) */ public IElement getElementByID(String id) { - return new HtmlUnitElementImpl(this.getHtmlElement(id)); + HtmlElement element = this.getHtmlElement(id); + if (element != null) + return new HtmlUnitElementImpl(element); + return null; } /* (non-Javadoc) Modified: trunk/src/changes/changes.xml =================================================================== --- trunk/src/changes/changes.xml 2008-10-29 00:24:52 UTC (rev 755) +++ trunk/src/changes/changes.xml 2008-10-29 02:08:52 UTC (rev 756) @@ -17,6 +17,9 @@ <action type="add" dev="jevonwright" issue="1728676"> Added WebTestCase(WebTester) constructor </action> + <action type="add" dev="jevonwright" issue="1519807"> + Added assertLabeledFieldEquals(id, text) and assertLabel*() methods + </action> <action type="update" dev="jevonwright"> BC CHANGE: setFormElement(), assertFormElementEquals() methods will no longer assert that a form already exists in the page (as allowed by the HTML standard). </action> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ JWebUnit-development mailing list JWebUnit-development@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jwebunit-development