diff --git a/src/main/java/io/github/seleniumquery/selectors/pseudoclasses/CheckedPseudoClass.java b/src/main/java/io/github/seleniumquery/selectors/pseudoclasses/CheckedPseudoClass.java index bcb9c811..506d34a8 100644 --- a/src/main/java/io/github/seleniumquery/selectors/pseudoclasses/CheckedPseudoClass.java +++ b/src/main/java/io/github/seleniumquery/selectors/pseudoclasses/CheckedPseudoClass.java @@ -1,25 +1,29 @@ package io.github.seleniumquery.selectors.pseudoclasses; import io.github.seleniumquery.selector.CompiledCssSelector; -import io.github.seleniumquery.selector.CssFilter; import io.github.seleniumquery.selector.DriverSupportService; - -import java.util.Arrays; -import java.util.List; +import io.github.seleniumquery.selector.SqElementFilter; +import io.github.seleniumquery.selector.SqXPathSelector; +import io.github.seleniumquery.selector.XPathSelectorFactory; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; public class CheckedPseudoClass implements PseudoClass { + private static final String INPUT_TAG_NAME = "input"; + private static final String OPTION_TAG_NAME = "option"; + + private static final String TYPE_ATTRIBUTE_NAME = "type"; + private static final String RADIO_ATTR_VALUE = "radio"; + private static final String CHECKBOX_ATTR_VALUE = "checkbox"; + private static final CheckedPseudoClass instance = new CheckedPseudoClass(); public static CheckedPseudoClass getInstance() { return instance; } private CheckedPseudoClass() { } - private static final List CHECKED_ALLOWED_TAGS = Arrays.asList("input", "option"); - private static final String CHECKED_PSEUDO_CLASS_NO_COLON = "checked"; private static final String CHECKED_PSEUDO_CLASS = ":"+CHECKED_PSEUDO_CLASS_NO_COLON; @@ -34,10 +38,17 @@ public boolean isPseudoClass(WebDriver driver, WebElement element, PseudoClassSe } public boolean isChecked(WebElement element) { - return CHECKED_ALLOWED_TAGS.contains(element.getTagName()) && element.isSelected(); + String tagName = element.getTagName(); + String typeAttribute = element.getAttribute(TYPE_ATTRIBUTE_NAME); + return element.isSelected() && + ( + OPTION_TAG_NAME.equals(tagName) + || + (INPUT_TAG_NAME.equals(tagName) && (RADIO_ATTR_VALUE.equals(typeAttribute) || CHECKBOX_ATTR_VALUE.equals(typeAttribute)) ) + ); } - private static final CssFilter checkedPseudoClassFilter = new PseudoClassFilter(getInstance()); + private static final SqElementFilter checkedPseudoClassFilter = new PseudoClassFilter(getInstance()); @Override public CompiledCssSelector compilePseudoClass(WebDriver driver, PseudoClassSelector pseudoClassSelector) { // https://developer.mozilla.org/en-US/docs/Web/CSS/:checked diff --git a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.html b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.html index 6a42e1b7..52168721 100644 --- a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.html +++ b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.html @@ -10,9 +10,9 @@
- - - + + +
diff --git a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.java b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.java index cf30f761..df78be04 100644 --- a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.java +++ b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/EnabledPseudoClassTest.java @@ -1,51 +1,58 @@ -package io.github.seleniumquery.selector.conditionals.pseudoclasses; - -import static io.github.seleniumquery.SeleniumQuery.$; -import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; -import io.github.seleniumquery.SetUpAndTearDownDriver; - -import org.junit.Rule; -import org.junit.Test; - -public class EnabledPseudoClassTest { - - @Rule - public SetUpAndTearDownDriver setUpAndTearDownDriverRule = new SetUpAndTearDownDriver(); - - @Test - public void enabledPseudo_with_tag_button() { - assertThat($("button:enabled").size(), is(1)); - } - - @Test - public void enabledPseudo_with_tag_input() { - assertThat($("input:enabled").size(), is(24)); - } - - @Test - public void enabledPseudo_with_tag_select() { - assertThat($("select:enabled").size(), is(1)); - } - - @Test - public void enabledPseudo_with_tag_option() { - assertThat($("option:enabled").size(), is(3)); - } - - @Test - public void enabledPseudo_with_tag_optgroup() { - assertThat($("optgroup:enabled").size(), is(3)); - } - - @Test - public void enabledPseudo_with_tag_textarea() { - assertThat($("textarea:enabled").size(), is(1)); - } - - @Test - public void enabledPseudo() { - assertThat($(":enabled").size(), is(33)); - } - +package io.github.seleniumquery.selector.conditionals.pseudoclasses; + +import static io.github.seleniumquery.SeleniumQuery.$; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import io.github.seleniumquery.SetUpAndTearDownDriver; + +import org.junit.Rule; +import org.junit.Test; + +public class EnabledPseudoClassTest { + + @Rule + public SetUpAndTearDownDriver setUpAndTearDownDriverRule = new SetUpAndTearDownDriver(); + + @Test + public void enabledPseudo_with_tag_button() { + assertThat($("button:enabled").size(), is(1)); + } + + @Test + public void enabledPseudo_with_tag_input() { + assertThat($("input:enabled").size(), is(24)); + } + + @Test + public void enabledPseudo_with_tag_select() { + assertThat($("select:enabled").size(), is(1)); + } + + @Test + public void enabledPseudo_with_tag_option() { + assertThat($("option:enabled").size(), is(3)); + } + + @Test + public void enabledPseudo_with_tag_optgroup() { + assertThat($("optgroup:enabled").size(), is(3)); + } + + @Test + public void enabledPseudo_with_tag_textarea() { + assertThat($("textarea:enabled").size(), is(1)); + } + + @Test + public void enabledPseudo() { + assertThat($(":enabled").size(), is(33)); + } + + @Test + public void enabledPseudo_with_class() { + assertThat($(".c").size(), is(3)); + assertThat($(".c:enabled").size(), is(1)); + assertThat($(".c:not(:enabled)").size(), is(2)); + } + } \ No newline at end of file diff --git a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.html b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.html index a222c5b2..ae9cfeb4 100644 --- a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.html +++ b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.html @@ -1,19 +1,25 @@ - - - - -seleniumQuery :hidden test page - - - -
-

aa

- - bb -
- + + + + +seleniumQuery :hidden test page + + + + +
+

aa

+ + bb +
+
+

this p is hidden by a class in its parent

+
+ \ No newline at end of file diff --git a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.java b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.java index 98721549..94beda79 100644 --- a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.java +++ b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/HiddenPseudoClassTest.java @@ -1,10 +1,10 @@ package io.github.seleniumquery.selector.conditionals.pseudoclasses; +import static io.github.seleniumquery.SeleniumQuery.$; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import io.github.seleniumquery.SetUpAndTearDownDriver; -import io.github.seleniumquery.selector.CssSelectorCompilerServiceTest; import java.util.List; @@ -19,9 +19,9 @@ public class HiddenPseudoClassTest { @Test public void hiddenPseudoClass() { - List elements = CssSelectorCompilerServiceTest.compileAndExecute(":hidden"); + List elements = $(":hidden").get(); - assertThat(elements, hasSize(7)); + assertThat(elements, hasSize(9)); assertThat(elements.get(0).getTagName(), is("head")); assertThat(elements.get(1).getTagName(), is("meta")); assertThat(elements.get(2).getTagName(), is("title")); @@ -29,6 +29,8 @@ public void hiddenPseudoClass() { assertThat(elements.get(4).getTagName(), is("h1")); assertThat(elements.get(5).getTagName(), is("button")); assertThat(elements.get(6).getTagName(), is("span")); + assertThat(elements.get(7).getTagName(), is("div")); + assertThat(elements.get(8).getTagName(), is("p")); } } \ No newline at end of file diff --git a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.html b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.html index 786ee7be..fd6eb8ac 100644 --- a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.html +++ b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.html @@ -13,5 +13,7 @@ + + \ No newline at end of file diff --git a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.java b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.java index 67e6fda6..2619c531 100644 --- a/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.java +++ b/src/test/java/io/github/seleniumquery/selector/conditionals/pseudoclasses/SubmitPseudoClassTest.java @@ -13,13 +13,13 @@ public class SubmitPseudoClassTest { @Rule public SetUpAndTearDownDriver setUpAndTearDownDriverRule = new SetUpAndTearDownDriver(); - // http://jsbin.com/mopireya/1/edit + // http://jsbin.com/mopireya/6/edit @Test public void submitPseudoClass() { - assertThat($("[type='submit']").size(), is(5)); - assertThat($(":submit").size(), is(3)); - assertThat($("*:submit").size(), is(3)); - assertThat($("input:submit").size(), is(1)); + assertThat($("[type='submit']").size(), is(6)); + assertThat($(":submit").size(), is(4)); + assertThat($("*:submit").size(), is(4)); + assertThat($("input:submit").size(), is(2)); assertThat($("div:submit").size(), is(0)); assertThat($("span:submit").size(), is(0)); @@ -33,6 +33,7 @@ public void submitPseudoClass() { assertThat($("#b1").is(":submit"), is(true)); + // #Cross-Driver (not a workaround, just documenting a difference) // the line below depends on the browser // firefox (only when through selenium!!!) considers that element's attribute type is // actually submit, even though it is empty. @@ -44,6 +45,9 @@ public void submitPseudoClass() { assertThat($("#b2").is(":submit"), is(true)); assertThat($("#b2").is("[type='submit']"), is(true)); + + assertThat($(".clz:submit").size(), is(1)); + assertThat($("#i1c").is(".clz:submit"), is(true)); } } \ No newline at end of file diff --git a/src/test/java/io/github/seleniumquery/selectors/attributes/IdAttributeCssSelectorTest.html b/src/test/java/io/github/seleniumquery/selectors/attributes/IdAttributeCssSelectorTest.html new file mode 100644 index 00000000..7481c988 --- /dev/null +++ b/src/test/java/io/github/seleniumquery/selectors/attributes/IdAttributeCssSelectorTest.html @@ -0,0 +1,10 @@ + + + + +seleniumQuery #id test page + + +
abc
+ + \ No newline at end of file diff --git a/src/test/java/io/github/seleniumquery/selectors/attributes/IdAttributeCssSelectorTest.java b/src/test/java/io/github/seleniumquery/selectors/attributes/IdAttributeCssSelectorTest.java new file mode 100644 index 00000000..a2300a16 --- /dev/null +++ b/src/test/java/io/github/seleniumquery/selectors/attributes/IdAttributeCssSelectorTest.java @@ -0,0 +1,22 @@ +package io.github.seleniumquery.selectors.attributes; + +import static io.github.seleniumquery.SeleniumQuery.$; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import io.github.seleniumquery.SetUpAndTearDownDriver; + +import org.junit.Rule; +import org.junit.Test; + +public class IdAttributeCssSelectorTest { + + @Rule + public SetUpAndTearDownDriver setUpAndTearDownDriverRule = new SetUpAndTearDownDriver(); + + @Test + public void visiblePseudoClass() throws Exception { + assertThat($("#myId").size(), is(1)); + assertThat($("#myId").text(), is("abc")); + } + +} \ No newline at end of file