1
1
/*
2
- * Copyright (c) 2015 seleniumQuery authors
2
+ * Copyright (c) 2016 seleniumQuery authors
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
28
28
import org .w3c .css .sac .Selector ;
29
29
import org .w3c .css .sac .SelectorList ;
30
30
31
+ import java .util .ArrayList ;
31
32
import java .util .List ;
32
33
import java .util .regex .Matcher ;
33
34
import java .util .regex .Pattern ;
@@ -46,35 +47,79 @@ public class IsFunction {
46
47
public static boolean is (SeleniumQueryObject seleniumQueryObject , String selector ) {
47
48
return is (seleniumQueryObject .getWebDriver (), seleniumQueryObject .get (), selector );
48
49
}
49
-
50
+
50
51
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
+ }
76
121
77
- private static boolean hasNegatedPresent (ArgumentMap argumentMap , String parsedSimpleSelector ) {
122
+ private static boolean hasNegatedPresent (ArgumentMap argumentMap , String parsedSimpleSelector ) {
78
123
Matcher m = NOT_SQ_PATTERN .matcher (parsedSimpleSelector );
79
124
while (m .find ()) {
80
125
String argumentMapIndex = m .group (1 );
0 commit comments