public static WebElement closest(WebDriver driver, WebElement element, String selector) { WebElement ancestorOrSelf = element; // begins by evaluating the element itself while (ancestorOrSelf != null) { if (CssSelectorMatcherService.elementMatchesStringSelector(driver, ancestorOrSelf, selector)) { return ancestorOrSelf; } ancestorOrSelf = SelectorUtils.parent(ancestorOrSelf); } // if ancestorOrSelf is null, it reached document root, // so no ancestor matching the selector was found return null; }
public static WebElement closest(WebDriver driver, WebElement element, String selector) { WebElement ancestorOrSelf = element; // begins by evaluating the element itself while (ancestorOrSelf != null) { if (CssSelectorMatcherService.elementMatchesStringSelector(driver, ancestorOrSelf, selector)) { return ancestorOrSelf; } ancestorOrSelf = SelectorUtils.parent(ancestorOrSelf); } // if ancestorOrSelf is null, it reached document root, // so no ancestor matching the selector was found return null; }
@Override public boolean isPseudoClass(WebDriver driver, WebElement element, PseudoClassSelector pseudoClassSelector) { String notSelector = pseudoClassSelector.getPseudoClassContent(); return !CssSelectorMatcherService.elementMatchesStringSelector(driver, element, notSelector); }
@Override public boolean isPseudoClass(WebDriver driver, WebElement element, PseudoClassSelector pseudoClassSelector) { String notSelector = pseudoClassSelector.getPseudoClassContent(); return !CssSelectorMatcherService.elementMatchesStringSelector(driver, element, notSelector); }
public static SeleniumQueryObject children(SeleniumQueryObject caller, String selector) { List<WebElement> elements = caller.get(); WebDriver webDriver = caller.getWebDriver(); List<WebElement> children = getChildren(elements); for (Iterator<WebElement> iterator = children.iterator(); iterator.hasNext();) { WebElement child = iterator.next(); if (!CssSelectorMatcherService.elementMatchesStringSelector(webDriver, child, selector)) { iterator.remove(); } } return SqObjectFactory.instance().createWithInvalidSelector(webDriver, children, caller); }
public static SeleniumQueryObject children(SeleniumQueryObject caller, String selector) { List<WebElement> elements = caller.get(); WebDriver webDriver = caller.getWebDriver(); List<WebElement> children = getChildren(elements); for (Iterator<WebElement> iterator = children.iterator(); iterator.hasNext();) { WebElement child = iterator.next(); if (!CssSelectorMatcherService.elementMatchesStringSelector(webDriver, child, selector)) { iterator.remove(); } } return SqObjectFactory.instance().createWithInvalidSelector(webDriver, children, caller); }
@Test(expected= SeleniumQueryException.class) public void attribute_equals_unquoted_space_is_not_valid() { WebElement myA = driver.findElement(By.id("myA")); CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rel=nofollow self]"); // should throw exception }
public void bizarre_escaping() { WebElement containsDiv = driver.findElement(By.id("containsDiv")); List<WebElement> containsDivs = containsDiv.findElements(By.tagName("div")); // <div>a\"b)c</div> WebElement div5 = containsDivs.get(5); String slash = "\\\\"+"\\\\"; // after escaped by the java compiler: "\\\\" -- will become a \ after escaped by the css parser String quote = "\\"+"\""; // after escaped by the java compiler: "\"" -- will become a " after escaped by the css parser // TODO jQuery's quote escaping is messy! assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, div5, ":contains(a"+ slash + quote + "b\\)c)"), is(true)); // should be true?? assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, div5, ":contains('a"+ slash + "\"b)c')"), is(true)); // ?? assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, div5, ":contains(\"a"+ slash + quote + "b)c\")"), is(true)); // ?? }
@Test public void className_and_id() { WebElement span = driver.findElement(By.tagName("span")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, span, ".someClass"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d1")), ".one"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d2")), ".one"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d3")), ".one"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d4")), ".one"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d5")), ".one"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d6")), ".one"), is(true)); }
@Test public void attribute_equals() { WebElement myA = driver.findElement(By.id("myA")); WebElement myA2 = driver.findElement(By.id("myA2")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rel=\"nofollow self\"]"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rel='nofollow self']"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA2, "a[hreflang=en]"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[attrDOESnotExist=yay]"), is(false)); // case INsensitive assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rEL='noFOLLow sELf']"), is(true)); }
@Test public void attribute_not_equals() { WebElement myA = driver.findElement(By.id("myA")); WebElement myA2 = driver.findElement(By.id("myA2")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rel!=\"nofollow self\"]"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rel!='nofollow self']"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA2, "a[hreflang!=en]"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[attrDOESnotExist!=yay]"), is(true)); // case INsensitive assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rEL!='noFOLLow sELf']"), is(false)); }
private void assertElementMatchesSelectorOrNot(WebElement containsDiv, String selector, boolean matchesOrNot) { assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, containsDiv, selector), is(matchesOrNot)); }
@Test public void present() { WebElement onlyChild = driver.findElement(By.id("onlyChild")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, onlyChild, ":present"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, onlyChild, ":not(:present)"), is(false)); }
@Test public void option() { WebElement optionElement = driver.findElement(By.cssSelector(".e4")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, optionElement, "option"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, optionElement, "*"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, optionElement, ":not(div)"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, optionElement, ":not(:not(div))"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, optionElement, ":not(:not(option.e4))"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, optionElement, ":only-of-type"), is(false)); }
@Test public void id() { WebElement span = driver.findElement(By.tagName("span")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, span, "#somId"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d1")), "#d1"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, driver.findElement(By.id("d1")), "#d2"), is(false)); }
@Test public void html() { WebElement htmlElement = driver.findElement(By.cssSelector("html")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, htmlElement, "option"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, htmlElement, "*"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, htmlElement, ":root"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, htmlElement, ":only-of-type"), is(true)); }
@Test public void eq() { WebElement brazilian_p = driver.findElement(By.id("brazilian-p")); WebElement french_p = driver.findElement(By.id("french-p")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, brazilian_p, "p:eq(0)"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, brazilian_p, ":eq(0)"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, french_p, "p:eq(1)"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, french_p, ":eq(1)"), is(false)); WebElement xidv = driver.findElement(By.id("xidv")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, xidv, ".ball.div:eq(1)"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, xidv, ".div:eq(1).ball"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, xidv, ".div.ball:eq(1)"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, xidv, ".div.ball:eq(0)"), is(true)); }
@Test public void body() { WebElement bodyElement = driver.findElement(By.cssSelector("body")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, bodyElement, "option"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, bodyElement, "*"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, bodyElement, ":root"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, bodyElement, ":only-of-type"), is(true)); }
@Test public void only_child() { WebElement onlyChild = driver.findElement(By.id("onlyChild")); WebElement grandsonWithSiblings = driver.findElement(By.id("grandsonWithSiblings")); WebElement brazilian_p = driver.findElement(By.id("brazilian-p")); WebElement hero_combo = driver.findElement(By.id("hero-combo")); WebElement htmlElement = driver.findElement(By.cssSelector("html")); WebElement bodyElement = driver.findElement(By.cssSelector("body")); String selector = ":only-child"; assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, onlyChild, selector), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, grandsonWithSiblings, selector), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, brazilian_p, selector), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, hero_combo, selector), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, bodyElement, selector), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, htmlElement, selector), is(false)); }
@Test public void has_attribute() { WebElement myA = driver.findElement(By.id("myA")); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rel]"), is(true)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[bozo]"), is(false)); assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[data-title]"), is(false)); assertThat($("#myA").is("a"), is(true)); assertThat($("#myA").is("a[rel]"), is(true)); assertThat($("#myA").is("a[bozo]"), is(false)); assertThat($("#myA").is("a[data-title]"), is(false)); // case INsensitive assertThat(CssSelectorMatcherService.elementMatchesStringSelector(driver, myA, "a[rEL]"), is(true)); assertThat($("#myA").is("a[rEL]"), is(true)); }