Skip to content

Commit fe8ef9e

Browse files
committed
:selected was converted to option:checked but didn't check if it was fully supported
...by the driver (some drivers have bugs and thus should not be taken as supporting).
1 parent 277c552 commit fe8ef9e

4 files changed

Lines changed: 80 additions & 22 deletions

File tree

src/main/java/io/github/seleniumquery/by/csstree/condition/pseudoclass/form/SQCssCheckedPseudoClass.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ public boolean isThisCSSPseudoClassNativelySupportedOn(WebDriver webDriver) {
5656
return isDriverWhereCheckedSelectorHasNoBugs(webDriver) && super.isThisCSSPseudoClassNativelySupportedOn(webDriver);
5757
}
5858

59-
private boolean isDriverWhereCheckedSelectorHasNoBugs(WebDriver webDriver) {
60-
DriverVersionUtils driverVersionUtils = DriverVersionUtils.getInstance();
61-
return !driverVersionUtils.isPhantomJSDriver(webDriver) && !driverVersionUtils.isHtmlUnitDriver(webDriver);
62-
}
63-
6459
@Override
6560
public SQLocatorCss toCssWhenNativelySupported() {
6661
return new SQLocatorCss(CHECKED_PSEUDO);
@@ -81,4 +76,9 @@ public SQCssPseudoMaybeNativelySupported getSQCssLocatorGenerationStrategy() {
8176
return checkedPseudoClassLocatorGenerationStrategy;
8277
}
8378

79+
public static boolean isDriverWhereCheckedSelectorHasNoBugs(WebDriver webDriver) {
80+
DriverVersionUtils driverVsUtils = DriverVersionUtils.getInstance();
81+
return !driverVsUtils.isPhantomJSDriver(webDriver) && !driverVsUtils.isHtmlUnitDriver(webDriver);
82+
}
83+
8484
}

src/main/java/io/github/seleniumquery/by/csstree/condition/pseudoclass/form/SQCssSelectedPseudoClass.java

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,52 @@
1717
package io.github.seleniumquery.by.csstree.condition.pseudoclass.form;
1818

1919
import io.github.seleniumquery.by.css.pseudoclasses.SelectedPseudoClass;
20+
import io.github.seleniumquery.by.csstree.condition.pseudoclass.SQCssPseudoClassCondition;
2021
import io.github.seleniumquery.by.csstree.condition.pseudoclass.SQCssPseudoMaybeNativelySupported;
2122
import io.github.seleniumquery.by.locator.SQLocatorCss;
2223
import io.github.seleniumquery.by.locator.SQLocatorXPath;
24+
import org.openqa.selenium.WebDriver;
2325

2426
/**
25-
* :selected can be translated into option:checked.
26-
* We need to expand how SQLocator handles the CSS selector, as we needed to override the previously set tag.
27+
* :selected
28+
* https://api.jquery.com/selected-selector/
29+
*
30+
* :selected is a "maybe natively supported" because it can be translated into option:checked (but
31+
* only if the browser supports - without bugs - the :checked pseudo).
2732
*
2833
* @author acdcjunior
2934
* @since 0.10.0
3035
*/
31-
public class SQCssSelectedPseudoClass extends SQCssPseudoMaybeNativelySupported {
36+
public class SQCssSelectedPseudoClass extends SQCssPseudoClassCondition {
3237

3338
public static final String PSEUDO = "selected";
3439

35-
@Override
36-
public String pseudoClassForCSSNativeSupportCheck() {
37-
return SQCssCheckedPseudoClass.CHECKED_PSEUDO;
38-
}
40+
public SQCssPseudoMaybeNativelySupported selectedPseudoClassLocatorGenerationStrategy = new SQCssPseudoMaybeNativelySupported() {
41+
@Override
42+
public boolean isThisCSSPseudoClassNativelySupportedOn(WebDriver webDriver) {
43+
return SQCssCheckedPseudoClass.isDriverWhereCheckedSelectorHasNoBugs(webDriver)
44+
&& super.isThisCSSPseudoClassNativelySupportedOn(webDriver);
45+
}
3946

40-
@Override
41-
public SQLocatorCss toCssWhenNativelySupported() {
42-
return new SQLocatorCss("option", ":checked");
43-
}
47+
@Override
48+
public String pseudoClassForCSSNativeSupportCheck() {
49+
return SQCssCheckedPseudoClass.CHECKED_PSEUDO;
50+
}
51+
52+
@Override
53+
public SQLocatorCss toCssWhenNativelySupported() {
54+
return new SQLocatorCss("option", ":checked");
55+
}
56+
57+
@Override
58+
public SQLocatorXPath toXPath() {
59+
return new SQLocatorXPath("self::option", SelectedPseudoClass.SELECTED_FILTER);
60+
}
61+
};
4462

4563
@Override
46-
public SQLocatorXPath toXPath() {
47-
return new SQLocatorXPath("self::option", SelectedPseudoClass.SELECTED_FILTER);
64+
public SQCssPseudoMaybeNativelySupported getSQCssLocatorGenerationStrategy() {
65+
return selectedPseudoClassLocatorGenerationStrategy;
4866
}
4967

5068
}

src/test/java/io/github/seleniumquery/by/csstree/condition/pseudoclass/PseudoClassAssertLocatorUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class PseudoClassAssertLocatorUtils {
3737

3838
public static final boolean PURE_CSS_IS_SUPPORTED = true;
3939
public static final boolean PURE_CSS_IS_NOT_SUPPORTED = false;
40-
public static final String CSS_ALL_TAGS_SELECTOR = "*";
40+
public static final String CSS_ALL_TAGS_SELECTOR = "*"; // TODO rename to "universal selector"
4141

4242
public static void assertPseudoClassHasLocatorWhenNativelySupported(SQCssConditionImplementedLocators pseudoClassObject, String pseudoClass,
4343
String expectedCss, boolean canPureCss,
@@ -53,6 +53,7 @@ public static void assertPseudoClassHasLocatorWhenNativelySupported(SQCssConditi
5353
);
5454
}
5555

56+
// TODO change parameter order, put pseudoClass first
5657
public static void assertPseudoClassHasLocatorWhenNotNativelySupported(SQCssConditionImplementedLocators pseudoClassObject, String pseudoClass,
5758
String expectedCss, boolean canPureCss,
5859
String expectedXPath,

src/test/java/io/github/seleniumquery/by/csstree/condition/pseudoclass/form/SQCssSelectedPseudoClassTest.java

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,20 @@
2626
import static io.github.seleniumquery.by.csstree.condition.pseudoclass.PseudoClassAssertLocatorUtils.*;
2727
import static io.github.seleniumquery.by.csstree.condition.pseudoclass.PseudoClassTestUtils.assertPseudo;
2828
import static io.github.seleniumquery.by.csstree.condition.pseudoclass.form.SQCssInputTypeAttributePseudoClassTest.TYPE_ATTR_LOWER_CASE;
29-
import static io.github.seleniumquery.by.locator.SQLocatorUtilsTest.universalSelectorLocator;
29+
import static io.github.seleniumquery.by.locator.SQLocatorUtilsTest.*;
3030
import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
3131

3232
public class SQCssSelectedPseudoClassTest {
3333

3434
private static final String SELECTED_PSEUDO = ":selected";
3535
private static final String SELECTED_XPATH_EXPRESSION = ".//*[self::option]";
36+
3637
private static final String CHECKED_AND_SELECTED_XPATH_EXPRESSION = ".//*[" +
3738
"((self::input and ("+ TYPE_ATTR_LOWER_CASE +" = 'radio' or "+ TYPE_ATTR_LOWER_CASE +" = 'checkbox')) or self::option) and self::option" +
3839
"]";
3940

41+
private static final String CHECKED_PSEUDO = ":checked";
42+
4043
@Test
4144
public void translate() {
4245
assertPseudo(SELECTED_PSEUDO, SQCssSelectedPseudoClass.class);
@@ -45,7 +48,7 @@ public void translate() {
4548
@Test
4649
public void toSQLocator__when_driver_has_native_support() {
4750
// supports pure CSS, but it is a translated one
48-
SQLocator previousLocator = universalSelectorLocator(SQLocatorUtilsTest.createMockDriverWithNativeSupportFor(":checked"));
51+
SQLocator previousLocator = universalSelectorLocator(SQLocatorUtilsTest.createMockDriverWithNativeSupportFor(CHECKED_PSEUDO));
4952
assertPseudoClassHasLocator(
5053
new SQCssSelectedPseudoClass(),
5154
previousLocator,
@@ -69,7 +72,7 @@ public void toSQLocator__when_driver_does_NOT_have_native_support() {
6972
@Test
7073
public void toSQLocator__when_driver_has_native_supportx() {
7174
// supports pure CSS, but it is a translated one
72-
WebDriver mockDriverWithNativeSupportForChecked = SQLocatorUtilsTest.createMockDriverWithNativeSupportFor(":checked");
75+
WebDriver mockDriverWithNativeSupportForChecked = SQLocatorUtilsTest.createMockDriverWithNativeSupportFor(CHECKED_PSEUDO);
7376
SQLocator locatorAfterChecked = new SQCssCheckedPseudoClass().toSQLocator(universalSelectorLocator(mockDriverWithNativeSupportForChecked));
7477

7578
assertPseudoClassHasLocator(
@@ -82,4 +85,40 @@ public void toSQLocator__when_driver_has_native_supportx() {
8285
);
8386
}
8487

88+
/**
89+
* #Cross-Driver
90+
* PhantomJSDriver's :checked has bugs!
91+
* See: {@link integration.crossdriver.driverbugs.PhantomJSAndHtmlUnitCheckedSelectorBugTest}
92+
*/
93+
@Test
94+
public void toSQLocator__when_driver_is_PHANTOMJSDRIVER_it_behaves_like_it_does_NOT_have_native_support() {
95+
WebDriver driver = createMockDriverWithNativeSupporForSelectorAndEmulatingPhantomJS(CHECKED_PSEUDO);
96+
SQLocator previousLocator = SQLocatorUtilsTest.universalSelectorLocator(driver);
97+
assertPseudoClassHasLocator(
98+
new SQCssSelectedPseudoClass(),
99+
previousLocator,
100+
CSS_ALL_TAGS_SELECTOR, PURE_CSS_IS_NOT_SUPPORTED,
101+
SELECTED_XPATH_EXPRESSION,
102+
contains(SelectedPseudoClass.SELECTED_FILTER)
103+
);
104+
}
105+
106+
/**
107+
* #Cross-Driver
108+
* HtmlUnitDriver's :checked has bugs!
109+
* See: {@link integration.crossdriver.driverbugs.PhantomJSAndHtmlUnitCheckedSelectorBugTest}
110+
*/
111+
@Test
112+
public void toSQLocator__when_driver_is_HTMLUNITDRIVER_it_behaves_like_it_does_NOT_have_native_support() {
113+
WebDriver driver = createMockDriverWithNativeSupporForSelectorAndEmulatingHtmlUnit(CHECKED_PSEUDO);
114+
SQLocator previousLocator = SQLocatorUtilsTest.universalSelectorLocator(driver);
115+
assertPseudoClassHasLocator(
116+
new SQCssSelectedPseudoClass(),
117+
previousLocator,
118+
CSS_ALL_TAGS_SELECTOR, PURE_CSS_IS_NOT_SUPPORTED,
119+
SELECTED_XPATH_EXPRESSION,
120+
contains(SelectedPseudoClass.SELECTED_FILTER)
121+
);
122+
}
123+
85124
}

0 commit comments

Comments
 (0)