8000 #113 - isFunction refactored · seleniumQuery/seleniumQuery@47d9ef0 · GitHub
[go: up one dir, main page]

Skip to content

Commit 47d9ef0

Browse files
committed
#113 - isFunction refactored
1 parent e2d9d02 commit 47d9ef0

File tree

2 files changed

+81
-30
lines changed

2 files changed

+81
-30
lines changed

src/main/java/io/github/seleniumquery/functions/jquery/traversing/filtering/IsFunction.java

Lines changed: 73 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015 seleniumQuery authors
2+
* Copyright (c) 2016 seleniumQuery authors
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -28,6 +28,7 @@
2828
import org.w3c.css.sac.Selector;
2929
import org.w3c.css.sac.SelectorList;
3030

31+
import java.util.ArrayList;
3132
import java.util.List;
3233
import java.util.regex.Matcher;
3334
import java.util.regex.Pattern;
@@ -46,35 +47,79 @@ public class IsFunction {
4647
public static boolean is(SeleniumQueryObject seleniumQueryObject, String selector) {
4748
return is(seleniumQueryObject.getWebDriver(), seleniumQueryObject.get(), selector);
4849
}
49-
50+
5051
public static boolean is(WebDriver driver, List<WebElement> elements, String selector) {
51-
if (selector.trim().isEmpty()) {
52-
return false;
53-
}
54-
CssParsedSelectorList cssParsedSelectorList = CssSelectorParser.parseSelector(selector);
55-
SelectorList selectorList = cssParsedSelectorList.getSelectorList();
56-
ArgumentMap argumentMap = cssParsedSelectorList.getArgumentMap();
57-
58-
for (int i = 0; i < selectorList.getLength(); i++) {
59-
Selecto 8000 r parsedSimpleSelector = selectorList.item(i);
60-
61-
// If there is a :not(:present), then having no element is a expected status!
62-
if (hasNegatedPresent(argumentMap, parsedSimpleSelector.toString()) && elements.isEmpty()) {
63-
return true;
64-
}
65-
66-
CssSelector<Selector, TagComponent> cssSelector = CssSelectorFactory.parsedSelectorToCssSelector(parsedSimpleSelector);
67-
for (WebElement webElement : elements) {
68-
// if any matches, then it returns true
69-
if (cssSelector.is(driver, webElement, argumentMap, parsedSimpleSelector)) {
70-
return true;
71-
}
72-
}
73-
}
74-
return false;
75-
}
52+
CompiledSelector compiledSelector = new CompiledSelector(selector);
53+
return compiledSelector.is(driver, elements);
54+
}
55+
56+
public static class CompiledSelector {
57+
58+
private class CompiledCssSelector {
59+
public final CssSelector<Selector, TagComponent> cssSelector;
60+
public final boolean hasNegatedPresent;
61+
private final ArgumentMap argumentMap;
62+
public final Selector parsedSimpleSelector;
63+
public CompiledCssSelector(CssSelector<Selector, TagComponent> cssSelector, boolean hasNegatedPresent, ArgumentMap argumentMap, Selector parsedSimpleSelector) {
64+
this.cssSelector = cssSelector;
65+
this.hasNegatedPresent = hasNegatedPresent;
66+
this.argumentMap = argumentMap;
67+
this.parsedSimpleSelector = parsedSimpleSelector;
68+
}
69+
}
70+
71+
private boolean emptySelector = false;
72+
private List<CompiledCssSelector> compiledCssSelectors;
73+
74+
public CompiledSelector(String selector) {
75+
if (selector.trim().isEmpty()) {
76+
this.emptySelector = true;
77+
} else {
78+
compiledCssSelectors = compileCssSelector(selector);
79+
}
80+
}
81+
82+
private List<CompiledCssSelector> compileCssSelector(String selector) {
83+
CssParsedSelectorList cssParsedSelectorList = CssSelectorParser.parseSelector(selector);
84+
SelectorList selectorList = cssParsedSelectorList.getSelectorList();
85+
ArgumentMap argumentMap = cssParsedSelectorList.getArgumentMap();
86+
87+
List<CompiledCssSelector> compiledCssSelectors = new ArrayList<>();
88+
for (int i = 0; i < selectorList.getLength(); i++) {
89+
Selector parsedSimpleSelector = selectorList.item(i);
90+
boolean hasNegatedPresent = hasNegatedPresent(argumentMap, parsedSimpleSelector.toString());
91+
CssSelector<Selector, TagComponent> cssSelector = CssSelectorFactory.parsedSelectorToCssSelector(parsedSimpleSelector);
92+
compiledCssSelectors.add(new CompiledCssSelector(cssSelector, hasNegatedPresent, argumentMap, parsedSimpleSelector));
93+
}
94+
return compiledCssSelectors;
95+
}
96+
97+
public boolean is(WebDriver driver, List<WebElement> elements) {
98+
if (emptySelector) {
99+
return false;
100+
}
101+
// If there is a :not(:present), then having no element is a expected status!
102+
if (elements.isEmpty()) {
103+
for (CompiledCssSelector s : compiledCssSelectors) {
104+
if (s.hasNegatedPresent) {
105+
return true;
106+
}
107+
}
108+
}
109+
for (CompiledCssSelector s : compiledCssSelectors) {
110+
for (WebElement webElement : elements) {
111+
// if any matches, then it returns true
112+
if (s.cssSelector.is(driver, webElement, s.argumentMap, s.parsedSimpleSelector)) {
113+
return true;
114+
}
115+
}
116+
}
117+
return false;
118+
}
119+
120+
}
76121

77-
private static boolean hasNegatedPresent(ArgumentMap argumentMap, String parsedSimpleSelector) {
122+
private static boolean hasNegatedPresent(ArgumentMap argumentMap, String parsedSimpleSelector) {
78123
Matcher m = NOT_SQ_PATTERN.matcher(parsedSimpleSelector);
79124
while (m.find()) {
80125
String argumentMapIndex = m.group(1);

src/test/java/endtoend/functions/jquery/traversing/IsFunctionTest.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2015 seleniumQuery authors
2+
* Copyright (c) 2016 seleniumQuery authors
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,10 +16,10 @@
1616

1717
package endtoend.functions.jquery.traversing;
1818

19-
import testinfrastructure.junitrule.SetUpAndTearDownDriver;
2019
import org.junit.ClassRule;
2120
import org.junit.Rule;
2221
import org.junit.Test;
22+
import testinfrastructure.junitrule.SetUpAndTearDownDriver;
2323

2424
import static io.github.seleniumquery.SeleniumQuery.$;
2525
import static org.hamcrest.Matchers.is;
@@ -66,5 +66,11 @@ public void is_function__with_very_permissive_sets() {
6666
assertThat($("div").is("*"), is(true));
6767
assertThat($("*").is("div"), is(true));
6868
}
69+
70+
@Test
71+
public void is_function__with_not_present() {
72+
assertThat($("*").is(":not(:present)"), is(false));
73+
assertThat($("#some-non-existant-id").is(":not(:present)"), is(true));
74+
}
6975

7076
}

0 commit comments

Comments
 (0)
0