package com.crawljax.condition; import java.io.IOException; import javax.xml.xpath.XPathExpressionException; import net.jcip.annotations.Immutable; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import com.crawljax.browser.EmbeddedBrowser; import com.crawljax.util.DomUtils; import com.crawljax.util.XPathHelper; import com.google.common.base.Objects; /** * A condition which returns true if the XPath expression returns one or more elements. NOTE: * element names must be in upper case and attributes in lower case. */ @Immutable public class XPathCondition implements Condition { private final String expression; /** * Construct xpath condition. * * @param expression * The actual xpath expression. */ public XPathCondition(String expression) { this.expression = expression; } @Override public boolean check(EmbeddedBrowser browser) { return checkXPathExpression(browser); } private boolean checkXPathExpression(EmbeddedBrowser browser) { try { Document document = DomUtils.asDocument(browser.getStrippedDom()); NodeList nodeList = XPathHelper.evaluateXpathExpression(document, expression); return nodeList.getLength() > 0; } catch (XPathExpressionException | IOException e) { // Exception is caught, check failed so return false; return false; } } @Override public int hashCode() { return Objects.hashCode(getClass(), expression); } @Override public boolean equals(Object object) { if (object instanceof XPathCondition) { XPathCondition that = (XPathCondition) object; return Objects.equal(this.expression, that.expression); } return false; } @Override public String toString() { return Objects.toStringHelper(this) .add("expression", expression) .toString(); } }