[ { "name": "Type selector, matching html element", "selector": "html", "expect": [ "html" ], "exclude": [ "element", "fragment", "detached" ], "level": 1 }, { "name": "Type selector, matching body element", "selector": "body", "expect": [ "body" ], "exclude": [ "element", "fragment", "detached" ], "level": 1 }, { "name": "Universal selector, matching all children of element with specified ID", "selector": "#universal>*", "expect": [ "universal-p1", "universal-hr1", "universal-pre1", "universal-p2", "universal-address1" ], "level": 2 }, { "name": "Universal selector, matching all grandchildren of element with specified ID", "selector": "#universal>*>*", "expect": [ "universal-code1", "universal-span1", "universal-a1", "universal-code2" ], "level": 2 }, { "name": "Universal selector, matching all children of empty element with specified ID", "selector": "#empty>*", "expect": [], "level": 2 }, { "name": "Universal selector, matching all descendants of element with specified ID", "selector": "#universal *", "expect": [ "universal-p1", "universal-code1", "universal-hr1", "universal-pre1", "universal-span1", "universal-p2", "universal-a1", "universal-address1", "universal-code2", "universal-a2" ], "level": 2 }, { "name": "Attribute presence selector, matching align attribute with value", "selector": ".attr-presence-div1[align]", "expect": [ "attr-presence-div1" ], "level": 2 }, { "name": "Attribute presence selector, matching align attribute with empty value", "selector": ".attr-presence-div2[align]", "expect": [ "attr-presence-div2" ], "level": 2 }, { "name": "Attribute presence selector, matching title attribute, case insensitivity", "selector": "#attr-presence [TiTlE]", "expect": [ "attr-presence-a1", "attr-presence-span1" ], "exclude": [ "xhtml" ], "level": 2 }, { "name": "Attribute presence selector, matching custom data-* attribute", "selector": "[data-attr-presence]", "expect": [ "attr-presence-pre1", "attr-presence-blockquote1" ], "level": 2 }, { "name": "Attribute presence selector, not matching attribute with similar name", "selector": ".attr-presence-div3[align], .attr-presence-div4[align]", "expect": [], "level": 2 }, { "name": "Attribute presence selector, matching attribute with non-ASCII characters", "selector": "ul[data-中文]", "expect": [ "attr-presence-ul1" ], "level": 2 }, { "name": "Attribute presence selector, not matching default option without selected attribute", "selector": "#attr-presence-select1 option[selected]", "expect": [], "level": 2 }, { "name": "Attribute presence selector, matching option with selected attribute", "selector": "#attr-presence-select2 option[selected]", "expect": [ "attr-presence-select2-option4" ], "level": 2 }, { "name": "Attribute presence selector, matching multiple options with selected attributes", "selector": "#attr-presence-select3 option[selected]", "expect": [ "attr-presence-select3-option2", "attr-presence-select3-option3" ], "level": 2 }, { "name": "Attribute value selector, matching align attribute with value", "selector": "#attr-value [align=\"center\"]", "expect": [ "attr-value-div1" ], "level": 2 }, { "name": "Attribute value selector, matching align attribute with empty value", "selector": "#attr-value [align=\"\"]", "expect": [ "attr-value-div2" ], "level": 2 }, { "name": "Attribute value selector, not matching align attribute with partial value", "selector": "#attr-value [align=\"c\"]", "expect": [], "level": 2 }, { "name": "Attribute value selector, not matching align attribute with incorrect value", "selector": "#attr-value [align=\"centera\"]", "expect": [], "level": 2 }, { "name": "Attribute value selector, matching custom data-* attribute with unicode escaped value", "selector": "[data-attr-value=\"\\e9\"]", "expect": [ "attr-value-div3" ], "level": 2 }, { "name": "Attribute value selector, matching custom data-* attribute with escaped character", "selector": "[data-attr-value_foo=\"\\e9\"]", "expect": [ "attr-value-div4" ], "level": 2 }, { "name": "Attribute value selector with single-quoted value, matching multiple inputs with type attributes", "selector": "#attr-value input[type='hidden'],#attr-value input[type='radio']", "expect": [ "attr-value-input3", "attr-value-input4", "attr-value-input6", "attr-value-input8", "attr-value-input9" ], "level": 2 }, { "name": "Attribute value selector with double-quoted value, matching multiple inputs with type attributes", "selector": "#attr-value input[type=\"hidden\"],#attr-value input[type='radio']", "expect": [ "attr-value-input3", "attr-value-input4", "attr-value-input6", "attr-value-input8", "attr-value-input9" ], "level": 2 }, { "name": "Attribute value selector with unquoted value, matching multiple inputs with type attributes", "selector": "#attr-value input[type=hidden],#attr-value input[type=radio]", "expect": [ "attr-value-input3", "attr-value-input4", "attr-value-input6", "attr-value-input8", "attr-value-input9" ], "level": 2 }, { "name": "Attribute value selector, matching attribute with value using non-ASCII characters", "selector": "[data-attr-value=中文]", "expect": [ "attr-value-div5" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector, matching class attribute with value", "selector": "#attr-whitespace [class~=\"div1\"]", "expect": [ "attr-whitespace-div1" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector, not matching class attribute with empty value", "selector": "#attr-whitespace [class~=\"\"]", "expect": [], "level": 2 }, { "name": "Attribute whitespace-separated list selector, not matching class attribute with partial value", "selector": "[data-attr-whitespace~=\"div\"]", "expect": [], "level": 2 }, { "name": "Attribute whitespace-separated list selector, matching custom data-* attribute with unicode escaped value", "selector": "[data-attr-whitespace~=\"\\0000e9\"]", "expect": [ "attr-whitespace-div4" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector, matching custom data-* attribute with escaped character", "selector": "[data-attr-whitespace_foo~=\"\\e9\"]", "expect": [ "attr-whitespace-div5" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector with single-quoted value, matching multiple links with rel attributes", "selector": "#attr-whitespace a[rel~='bookmark'], #attr-whitespace a[rel~='nofollow']", "expect": [ "attr-whitespace-a1", "attr-whitespace-a2", "attr-whitespace-a3", "attr-whitespace-a5", "attr-whitespace-a7" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector with double-quoted value, matching multiple links with rel attributes", "selector": "#attr-whitespace a[rel~=\"bookmark\"],#attr-whitespace a[rel~='nofollow']", "expect": [ "attr-whitespace-a1", "attr-whitespace-a2", "attr-whitespace-a3", "attr-whitespace-a5", "attr-whitespace-a7" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector with unquoted value, matching multiple links with rel attributes", "selector": "#attr-whitespace a[rel~=bookmark], #attr-whitespace a[rel~=nofollow]", "expect": [ "attr-whitespace-a1", "attr-whitespace-a2", "attr-whitespace-a3", "attr-whitespace-a5", "attr-whitespace-a7" ], "level": 2 }, { "name": "Attribute whitespace-separated list selector with double-quoted value, not matching value with space", "selector": "#attr-whitespace a[rel~=\"book mark\"]", "expect": [], "level": 2 }, { "name": "Attribute whitespace-separated list selector, matching title attribute with value using non-ASCII characters", "selector": "#attr-whitespace [title~=中文]", "expect": [ "attr-whitespace-p1" ], "level": 2 }, { "name": "Attribute hyphen-separated list selector, not matching unspecified lang attribute", "selector": "#attr-hyphen-div1[lang|=\"en\"]", "expect": [], "level": 2 }, { "name": "Attribute hyphen-separated list selector, matching lang attribute with exact value", "selector": "#attr-hyphen-div2[lang|=\"fr\"]", "expect": [ "attr-hyphen-div2" ], "level": 2 }, { "name": "Attribute hyphen-separated list selector, matching lang attribute with partial value", "selector": "#attr-hyphen-div3[lang|=\"en\"]", "expect": [ "attr-hyphen-div3" ], "level": 2 }, { "name": "Attribute hyphen-separated list selector, not matching incorrect value", "selector": "#attr-hyphen-div4[lang|=\"es-AR\"]", "expect": [], "level": 2 }, { "name": "Attribute begins with selector, matching href attributes beginning with specified substring", "selector": "#attr-begins a[href^=\"http://www\"]", "expect": [ "attr-begins-a1", "attr-begins-a3" ], "level": 3 }, { "name": "Attribute begins with selector, matching lang attributes beginning with specified substring, ", "selector": "#attr-begins [lang^=\"en-\"]", "expect": [ "attr-begins-div2", "attr-begins-div4" ], "level": 3 }, { "name": "Attribute begins with selector, not matching class attribute not beginning with specified substring", "selector": "#attr-begins [class^=apple]", "expect": [], "level": 3 }, { "name": "Attribute begins with selector with single-quoted value, matching class attribute beginning with specified substring", "selector": "#attr-begins [class^=' apple']", "expect": [ "attr-begins-p1" ], "level": 3 }, { "name": "Attribute begins with selector with double-quoted value, matching class attribute beginning with specified substring", "selector": "#attr-begins [class^=\" apple\"]", "expect": [ "attr-begins-p1" ], "level": 3 }, { "name": "Attribute begins with selector with unquoted value, not matching class attribute not beginning with specified substring", "selector": "#attr-begins [class^= apple]", "expect": [], "level": 3 }, { "name": "Attribute ends with selector, matching href attributes ending with specified substring", "selector": "#attr-ends a[href$=\".org\"]", "expect": [ "attr-ends-a1", "attr-ends-a3" ], "level": 3 }, { "name": "Attribute ends with selector, matching lang attributes ending with specified substring, ", "selector": "#attr-ends [lang$=\"-CH\"]", "expect": [ "attr-ends-div2", "attr-ends-div4" ], "level": 3 }, { "name": "Attribute ends with selector, not matching class attribute not ending with specified substring", "selector": "#attr-ends [class$=apple]", "expect": [], "level": 3 }, { "name": "Attribute ends with selector with single-quoted value, matching class attribute ending with specified substring", "selector": "#attr-ends [class$='apple ']", "expect": [ "attr-ends-p1" ], "level": 3 }, { "name": "Attribute ends with selector with double-quoted value, matching class attribute ending with specified substring", "selector": "#attr-ends [class$=\"apple \"]", "expect": [ "attr-ends-p1" ], "level": 3 }, { "name": "Attribute ends with selector with unquoted value, not matching class attribute not ending with specified substring", "selector": "#attr-ends [class$=apple ]", "expect": [], "level": 3 }, { "name": "Attribute contains selector, matching href attributes beginning with specified substring", "selector": "#attr-contains a[href*=\"http://www\"]", "expect": [ "attr-contains-a1", "attr-contains-a3" ], "level": 3 }, { "name": "Attribute contains selector, matching href attributes ending with specified substring", "selector": "#attr-contains a[href*=\".org\"]", "expect": [ "attr-contains-a1", "attr-contains-a2" ], "level": 3 }, { "name": "Attribute contains selector, matching href attributes containing specified substring", "selector": "#attr-contains a[href*=\".example.\"]", "expect": [ "attr-contains-a1", "attr-contains-a3" ], "level": 3 }, { "name": "Attribute contains selector, matching lang attributes beginning with specified substring, ", "selector": "#attr-contains [lang*=\"en-\"]", "expect": [ "attr-contains-div2", "attr-contains-div6" ], "level": 3 }, { "name": "Attribute contains selector, matching lang attributes ending with specified substring, ", "selector": "#attr-contains [lang*=\"-CH\"]", "expect": [ "attr-contains-div3", "attr-contains-div5" ], "level": 3 }, { "name": "Attribute contains selector with single-quoted value, matching class attribute beginning with specified substring", "selector": "#attr-contains [class*=' apple']", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with single-quoted value, matching class attribute ending with specified substring", "selector": "#attr-contains [class*='orange ']", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with single-quoted value, matching class attribute containing specified substring", "selector": "#attr-contains [class*='ple banana ora']", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with double-quoted value, matching class attribute beginning with specified substring", "selector": "#attr-contains [class*=\" apple\"]", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with double-quoted value, matching class attribute ending with specified substring", "selector": "#attr-contains [class*=\"orange \"]", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with double-quoted value, matching class attribute containing specified substring", "selector": "#attr-contains [class*=\"ple banana ora\"]", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with unquoted value, matching class attribute beginning with specified substring", "selector": "#attr-contains [class*= apple]", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with unquoted value, matching class attribute ending with specified substring", "selector": "#attr-contains [class*=orange ]", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": "Attribute contains selector with unquoted value, matching class attribute containing specified substring", "selector": "#attr-contains [class*= banana ]", "expect": [ "attr-contains-p1" ], "level": 3 }, { "name": ":root pseudo-class selector, matching document root element", "selector": ":root", "expect": [ "html" ], "exclude": [ "element", "fragment", "detached" ], "level": 3 }, { "name": ":nth-child selector, matching the third child element", "selector": "#pseudo-nth-table1 :nth-child(3)", "expect": [ "pseudo-nth-td3", "pseudo-nth-td9", "pseudo-nth-tr3", "pseudo-nth-td15" ], "level": 3 }, { "name": ":nth-child selector, matching every third child element", "selector": "#pseudo-nth li:nth-child(3n)", "expect": [ "pseudo-nth-li3", "pseudo-nth-li6", "pseudo-nth-li9", "pseudo-nth-li12" ], "level": 3 }, { "name": ":nth-child selector, matching every second child element, starting from the fourth", "selector": "#pseudo-nth li:nth-child(2n+4)", "expect": [ "pseudo-nth-li4", "pseudo-nth-li6", "pseudo-nth-li8", "pseudo-nth-li10", "pseudo-nth-li12" ], "level": 3 }, { "name": ":nth-child selector, matching every fourth child element, starting from the third", "selector": "#pseudo-nth-p1 :nth-child(4n-1)", "expect": [ "pseudo-nth-em2", "pseudo-nth-span3" ], "level": 3 }, { "name": ":nth-last-child selector, matching the third last child element", "selector": "#pseudo-nth-table1 :nth-last-child(3)", "expect": [ "pseudo-nth-tr1", "pseudo-nth-td4", "pseudo-nth-td10", "pseudo-nth-td16" ], "level": 3 }, { "name": ":nth-last-child selector, matching every third child element from the end", "selector": "#pseudo-nth li:nth-last-child(3n)", "expect": [ "pseudo-nth-li1", "pseudo-nth-li4", "pseudo-nth-li7", "pseudo-nth-li10" ], "level": 3 }, { "name": ":nth-last-child selector, matching every second child element from the end, starting from the fourth last", "selector": "#pseudo-nth li:nth-last-child(2n+4)", "expect": [ "pseudo-nth-li1", "pseudo-nth-li3", "pseudo-nth-li5", "pseudo-nth-li7", "pseudo-nth-li9" ], "level": 3 }, { "name": ":nth-last-child selector, matching every fourth element from the end, starting from the third last", "selector": "#pseudo-nth-p1 :nth-last-child(4n-1)", "expect": [ "pseudo-nth-span2", "pseudo-nth-span4" ], "level": 3 }, { "name": ":nth-of-type selector, matching the third em element", "selector": "#pseudo-nth-p1 em:nth-of-type(3)", "expect": [ "pseudo-nth-em3" ], "level": 3 }, { "name": ":nth-of-type selector, matching every second element of their type", "selector": "#pseudo-nth-p1 :nth-of-type(2n)", "expect": [ "pseudo-nth-em2", "pseudo-nth-span2", "pseudo-nth-span4", "pseudo-nth-strong2", "pseudo-nth-em4" ], "level": 3 }, { "name": ":nth-of-type selector, matching every second elemetn of their type, starting from the first", "selector": "#pseudo-nth-p1 span:nth-of-type(2n-1)", "expect": [ "pseudo-nth-span1", "pseudo-nth-span3" ], "level": 3 }, { "name": ":nth-last-of-type selector, matching the thrid last em element", "selector": "#pseudo-nth-p1 em:nth-last-of-type(3)", "expect": [ "pseudo-nth-em2" ], "level": 3 }, { "name": ":nth-last-of-type selector, matching every second last element of their type", "selector": "#pseudo-nth-p1 :nth-last-of-type(2n)", "expect": [ "pseudo-nth-span1", "pseudo-nth-em1", "pseudo-nth-strong1", "pseudo-nth-em3", "pseudo-nth-span3" ], "level": 3 }, { "name": ":nth-last-of-type selector, matching every second last element of their type, starting from the last", "selector": "#pseudo-nth-p1 span:nth-last-of-type(2n-1)", "expect": [ "pseudo-nth-span2", "pseudo-nth-span4" ], "level": 3 }, { "name": ":first-of-type selector, matching the first em element", "selector": "#pseudo-nth-p1 em:first-of-type", "expect": [ "pseudo-nth-em1" ], "level": 3 }, { "name": ":first-of-type selector, matching the first of every type of element", "selector": "#pseudo-nth-p1 :first-of-type", "expect": [ "pseudo-nth-span1", "pseudo-nth-em1", "pseudo-nth-strong1" ], "level": 3 }, { "name": ":first-of-type selector, matching the first td element in each table row", "selector": "#pseudo-nth-table1 tr :first-of-type", "expect": [ "pseudo-nth-td1", "pseudo-nth-td7", "pseudo-nth-td13" ], "level": 3 }, { "name": ":last-of-type selector, matching the last em elemnet", "selector": "#pseudo-nth-p1 em:last-of-type", "expect": [ "pseudo-nth-em4" ], "level": 3 }, { "name": ":last-of-type selector, matching the last of every type of element", "selector": "#pseudo-nth-p1 :last-of-type", "expect": [ "pseudo-nth-span4", "pseudo-nth-strong2", "pseudo-nth-em4" ], "level": 3 }, { "name": ":last-of-type selector, matching the last td element in each table row", "selector": "#pseudo-nth-table1 tr :last-of-type", "expect": [ "pseudo-nth-td6", "pseudo-nth-td12", "pseudo-nth-td18" ], "level": 3 }, { "name": ":first-child pseudo-class selector, matching first child div element", "selector": "#pseudo-first-child div:first-child", "expect": [ "pseudo-first-child-div1" ], "level": 2 }, { "name": ":first-child pseudo-class selector, doesn't match non-first-child elements", "selector": ".pseudo-first-child-div2:first-child, .pseudo-first-child-div3:first-child", "expect": [], "level": 2 }, { "name": ":first-child pseudo-class selector, matching first-child of multiple elements", "selector": "#pseudo-first-child span:first-child", "expect": [ "pseudo-first-child-span1", "pseudo-first-child-span3", "pseudo-first-child-span5" ], "level": 2 }, { "name": ":last-child pseudo-class selector, matching last child div element", "selector": "#pseudo-last-child div:last-child", "expect": [ "pseudo-last-child-div3" ], "level": 3 }, { "name": ":last-child pseudo-class selector, doesn't match non-last-child elements", "selector": ".pseudo-last-child-div1:last-child, .pseudo-last-child-div2:first-child", "expect": [], "level": 3 }, { "name": ":last-child pseudo-class selector, matching first-child of multiple elements", "selector": "#pseudo-last-child span:last-child", "expect": [ "pseudo-last-child-span2", "pseudo-last-child-span4", "pseudo-last-child-span6" ], "level": 3 }, { "name": ":pseudo-only-child pseudo-class selector, matching all only-child elements", "selector": "#pseudo-only :only-child", "expect": [ "pseudo-only-span1" ], "level": 3 }, { "name": ":pseudo-only-child pseudo-class selector, matching only-child em elements", "selector": "#pseudo-only em:only-child", "expect": [], "level": 3 }, { "name": ":pseudo-only-of-type pseudo-class selector, matching all elements with no siblings of the same type", "selector": "#pseudo-only :only-of-type", "expect": [ "pseudo-only-span1", "pseudo-only-em1" ], "level": 3 }, { "name": ":pseudo-only-of-type pseudo-class selector, matching em elements with no siblings of the same type", "selector": "#pseudo-only em:only-of-type", "expect": [ "pseudo-only-em1" ], "level": 3 }, { "name": ":empty pseudo-class selector, matching empty p elements", "selector": "#pseudo-empty p:empty", "expect": [ "pseudo-empty-p1", "pseudo-empty-p2", "pseudo-empty-p3" ], "level": 3 }, { "name": ":empty pseudo-class selector, matching all empty elements", "selector": "#pseudo-empty :empty", "expect": [ "pseudo-empty-p1", "pseudo-empty-p2", "pseudo-empty-p3", "pseudo-empty-span1" ], "level": 3 }, { "name": ":link and :visited pseudo-class selectors, matching a and area elements with href attributes", "selector": "#pseudo-link :link, #pseudo-link :visited", "expect": [ "pseudo-link-a1", "pseudo-link-a2", "pseudo-link-area1" ], "level": 1 }, { "name": ":link and :visited pseudo-class selectors, matching link elements with href attributes", "selector": "#head :link, #head :visited", "expect": [ "pseudo-link-link1", "pseudo-link-link2" ], "exclude": [ "element", "fragment", "detached" ], "level": 1 }, { "name": ":target pseudo-class selector, matching the element referenced by the URL fragment identifier", "selector": ":target", "xfail": true, "expect": [ "target" ], "exclude": [ "fragment", "detached" ], "level": 3 }, { "name": ":lang pseudo-class selector, matching inherited language", "selector": "#pseudo-lang-div1:lang(en)", "expect": [ "pseudo-lang-div1" ], "exclude": [ "detached", "fragment" ], "level": 2 }, { "name": ":lang pseudo-class selector, matching specified language with exact value", "selector": "#pseudo-lang-div2:lang(fr)", "expect": [ "pseudo-lang-div2" ], "level": 2 }, { "name": ":lang pseudo-class selector, matching specified language with partial value", "selector": "#pseudo-lang-div3:lang(en)", "expect": [ "pseudo-lang-div3" ], "level": 2 }, { "name": ":lang pseudo-class selector, not matching incorrect language", "selector": "#pseudo-lang-div4:lang(es-AR)", "expect": [], "level": 2 }, { "name": ":enabled pseudo-class selector, matching all enabled form controls", "selector": "#pseudo-ui :enabled", "expect": [ "pseudo-ui-input1", "pseudo-ui-input2", "pseudo-ui-input3", "pseudo-ui-input4", "pseudo-ui-input5", "pseudo-ui-input6", "pseudo-ui-input7", "pseudo-ui-input8", "pseudo-ui-input9", "pseudo-ui-textarea1", "pseudo-ui-button1" ], "level": 3 }, { "name": ":enabled pseudo-class selector, matching all disabled form controls", "selector": "#pseudo-ui :disabled", "expect": [ "pseudo-ui-input10", "pseudo-ui-input11", "pseudo-ui-input12", "pseudo-ui-input13", "pseudo-ui-input14", "pseudo-ui-input15", "pseudo-ui-input16", "pseudo-ui-input17", "pseudo-ui-input18", "pseudo-ui-textarea2", "pseudo-ui-button2" ], "level": 3 }, { "name": ":checked pseudo-class selector, matching checked radio buttons and checkboxes", "selector": "#pseudo-ui :checked", "expect": [ "pseudo-ui-input4", "pseudo-ui-input6", "pseudo-ui-input13", "pseudo-ui-input15" ], "level": 3 }, { "name": ":not pseudo-class selector, matching ", "selector": "#not>:not(div)", "expect": [ "not-p1", "not-p2", "not-p3" ], "level": 3 }, { "name": ":not pseudo-class selector, matching ", "selector": "#not * :not(:first-child)", "expect": [ "not-em1", "not-em2", "not-em3" ], "level": 3 }, { "name": ":not pseudo-class selector, matching nothing", "selector": ":not(*)", "expect": [], "level": 3 }, { "name": ":not pseudo-class selector, matching nothing", "selector": ":not(*|*)", "expect": [], "level": 3 }, { "name": ":first-line pseudo-element (one-colon syntax) selector, not matching any elements", "selector": "#pseudo-element:first-line", "expect": [], "level": 2 }, { "name": "::first-line pseudo-element (two-colon syntax) selector, not matching any elements", "selector": "#pseudo-element::first-line", "expect": [], "level": 3 }, { "name": ":first-letter pseudo-element (one-colon syntax) selector, not matching any elements", "selector": "#pseudo-element:first-letter", "expect": [], "level": 2 }, { "name": "::first-letter pseudo-element (two-colon syntax) selector, not matching any elements", "selector": "#pseudo-element::first-letter", "expect": [], "level": 3 }, { "name": ":before pseudo-element (one-colon syntax) selector, not matching any elements", "selector": "#pseudo-element:before", "expect": [], "level": 2 }, { "name": "::before pseudo-element (two-colon syntax) selector, not matching any elements", "selector": "#pseudo-element::before", "expect": [], "level": 3 }, { "name": ":after pseudo-element (one-colon syntax) selector, not matching any elements", "selector": "#pseudo-element:after", "expect": [], "level": 2 }, { "name": "::after pseudo-element (two-colon syntax) selector, not matching any elements", "selector": "#pseudo-element::after", "expect": [], "level": 3 }, { "name": "Class selector, matching element with specified class", "selector": ".class-p", "expect": [ "class-p1", "class-p2", "class-p3" ], "level": 1 }, { "name": "Class selector, chained, matching only elements with all specified classes", "selector": "#class .apple.orange.banana", "expect": [ "class-div1", "class-div2", "class-p4", "class-div3", "class-p6", "class-div4" ], "level": 1 }, { "name": "Class Selector, chained, with type selector", "selector": "div.apple.banana.orange", "expect": [ "class-div1", "class-div2", "class-div3", "class-div4" ], "level": 1 }, { "name": "Class selector, matching element with class value using non-ASCII characters", "selector": ".台北Táiběi", "expect": [ "class-span1" ], "level": 1 }, { "name": "Class selector, matching multiple elements with class value using non-ASCII characters", "selector": ".台北", "expect": [ "class-span1", "class-span2" ], "level": 1 }, { "name": "Class selector, chained, matching element with multiple class values using non-ASCII characters", "selector": ".台北Táiběi.台北", "expect": [ "class-span1" ], "level": 1 }, { "name": "Class selector, matching element with class with escaped character", "selector": ".foo\\:bar", "expect": [ "class-span3" ], "level": 1 }, { "name": "Class selector, matching element with class with escaped character", "selector": ".test\\.foo\\[5\\]bar", "expect": [ "class-span4" ], "level": 1 }, { "name": "ID selector, matching element with specified id", "selector": "#id #id-div1", "expect": [ "id-div1" ], "level": 1 }, { "name": "ID selector, chained, matching element with specified id", "selector": "#id-div1, #id-div1", "expect": [ "id-div1" ], "level": 1 }, { "name": "ID selector, chained, matching element with specified id", "selector": "#id-div1, #id-div2", "expect": [ "id-div1", "id-div2" ], "level": 1 }, { "name": "ID Selector, chained, with type selector", "selector": "div#id-div1, div#id-div2", "expect": [ "id-div1", "id-div2" ], "level": 1 }, { "name": "ID selector, not matching non-existent descendant", "selector": "#id #none", "expect": [], "level": 1 }, { "name": "ID selector, not matching non-existent ancestor", "selector": "#none #id-div1", "expect": [], "level": 1 }, { "name": "ID selector, matching multiple elements with duplicate id", "selector": "#id-li-duplicate", "expect": [ "id-li-duplicate", "id-li-duplicate", "id-li-duplicate", "id-li-duplicate" ], "level": 1 }, { "name": "ID selector, matching id value using non-ASCII characters", "selector": "#台北Táiběi", "expect": [ "台北Táiběi" ], "level": 1 }, { "name": "ID selector, matching id value using non-ASCII characters", "selector": "#台北", "expect": [ "台北" ], "level": 1 }, { "name": "ID selector, matching id values using non-ASCII characters", "selector": "#台北Táiběi, #台北", "expect": [ "台北Táiběi", "台北" ], "level": 1 }, { "name": "ID selector, matching element with id with escaped character", "selector": "#\\#foo\\:bar", "expect": [ "#foo:bar" ], "level": 1 }, { "name": "ID selector, matching element with id with escaped character", "selector": "#test\\.foo\\[5\\]bar", "expect": [ "test.foo[5]bar" ], "level": 1 }, { "name": "Namespace selector, matching element with any namespace", "selector": "#any-namespace *|div", "expect": [ "any-namespace-div1", "any-namespace-div2", "any-namespace-div3", "any-namespace-div4" ], "level": 3, "xfail": true }, { "name": "Namespace selector, matching div elements in no namespace only", "selector": "#no-namespace |div", "expect": [ "no-namespace-div3" ], "level": 3, "xfail": true }, { "name": "Namespace selector, matching any elements in no namespace only", "selector": "#no-namespace |*", "expect": [ "no-namespace-div3" ], "level": 3, "xfail": true }, { "name": "Descendant combinator, matching element that is a descendant of an element with id", "selector": "#descendant div", "expect": [ "descendant-div1", "descendant-div2", "descendant-div3", "descendant-div4" ], "level": 1 }, { "name": "Descendant combinator, matching element with id that is a descendant of an element", "selector": "body #descendant-div1", "expect": [ "descendant-div1" ], "exclude": [ "detached", "fragment" ], "level": 1 }, { "name": "Descendant combinator, matching element with id that is a descendant of an element", "selector": "div #descendant-div1", "expect": [ "descendant-div1" ], "level": 1 }, { "name": "Descendant combinator, matching element with id that is a descendant of an element with id", "selector": "#descendant #descendant-div2", "expect": [ "descendant-div2" ], "level": 1 }, { "name": "Descendant combinator, matching element with class that is a descendant of an element with id", "selector": "#descendant .descendant-div2", "expect": [ "descendant-div2" ], "level": 1 }, { "name": "Descendant combinator, matching element with class that is a descendant of an element with class", "selector": ".descendant-div1 .descendant-div3", "expect": [ "descendant-div3" ], "level": 1 }, { "name": "Descendant combinator, not matching element with id that is not a descendant of an element with id", "selector": "#descendant-div1 #descendant-div4", "expect": [], "level": 1 }, { "name": "Descendant combinator, whitespace characters", "selector": "#descendant\t\r\n#descendant-div2", "expect": [ "descendant-div2" ], "level": 1 }, { "name": "Child combinator, matching element that is a child of an element with id", "selector": "#child>div", "expect": [ "child-div1", "child-div4" ], "level": 2 }, { "name": "Child combinator, matching element with id that is a child of an element", "selector": "div>#child-div1", "expect": [ "child-div1" ], "level": 2 }, { "name": "Child combinator, matching element with id that is a child of an element with id", "selector": "#child>#child-div1", "expect": [ "child-div1" ], "level": 2 }, { "name": "Child combinator, matching element with id that is a child of an element with class", "selector": "#child-div1>.child-div2", "expect": [ "child-div2" ], "level": 2 }, { "name": "Child combinator, matching element with class that is a child of an element with class", "selector": ".child-div1>.child-div2", "expect": [ "child-div2" ], "level": 2 }, { "name": "Child combinator, not matching element with id that is not a child of an element with id", "selector": "#child>#child-div3", "expect": [], "level": 2 }, { "name": "Child combinator, not matching element with id that is not a child of an element with class", "selector": "#child-div1>.child-div3", "expect": [], "level": 2 }, { "name": "Child combinator, not matching element with class that is not a child of an element with class", "selector": ".child-div1>.child-div3", "expect": [], "level": 2 }, { "name": "Child combinator, surrounded by whitespace", "selector": "#child-div1\t\r\n>\t\r\n#child-div2", "expect": [ "child-div2" ], "level": 2 }, { "name": "Child combinator, whitespace after", "selector": "#child-div1>\t\r\n#child-div2", "expect": [ "child-div2" ], "level": 2 }, { "name": "Child combinator, whitespace before", "selector": "#child-div1\t\r\n>#child-div2", "expect": [ "child-div2" ], "level": 2 }, { "name": "Child combinator, no whitespace", "selector": "#child-div1>#child-div2", "expect": [ "child-div2" ], "level": 2 }, { "name": "Adjacent sibling combinator, matching element that is an adjacent sibling of an element with id", "selector": "#adjacent-div2+div", "expect": [ "adjacent-div4" ], "level": 2 }, { "name": "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element", "selector": "div+#adjacent-div4", "expect": [ "adjacent-div4" ], "level": 2 }, { "name": "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element with id", "selector": "#adjacent-div2+#adjacent-div4", "expect": [ "adjacent-div4" ], "level": 2 }, { "name": "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with id", "selector": "#adjacent-div2+.adjacent-div4", "expect": [ "adjacent-div4" ], "level": 2 }, { "name": "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with class", "selector": ".adjacent-div2+.adjacent-div4", "expect": [ "adjacent-div4" ], "level": 2 }, { "name": "Adjacent sibling combinator, matching p element that is an adjacent sibling of a div element", "selector": "#adjacent div+p", "expect": [ "adjacent-p2" ], "level": 2 }, { "name": "Adjacent sibling combinator, not matching element with id that is not an adjacent sibling of an element with id", "selector": "#adjacent-div2+#adjacent-p2, #adjacent-div2+#adjacent-div1", "expect": [], "level": 2 }, { "name": "Adjacent sibling combinator, surrounded by whitespace", "selector": "#adjacent-p2\t\r\n+\t\r\n#adjacent-p3", "expect": [ "adjacent-p3" ], "level": 2 }, { "name": "Adjacent sibling combinator, whitespace after", "selector": "#adjacent-p2+\t\r\n#adjacent-p3", "expect": [ "adjacent-p3" ], "level": 2 }, { "name": "Adjacent sibling combinator, whitespace before", "selector": "#adjacent-p2\t\r\n+#adjacent-p3", "expect": [ "adjacent-p3" ], "level": 2 }, { "name": "Adjacent sibling combinator, no whitespace", "selector": "#adjacent-p2+#adjacent-p3", "expect": [ "adjacent-p3" ], "level": 2 }, { "name": "General sibling combinator, matching element that is a sibling of an element with id", "selector": "#sibling-div2~div", "expect": [ "sibling-div4", "sibling-div6" ], "level": 3 }, { "name": "General sibling combinator, matching element with id that is a sibling of an element", "selector": "div~#sibling-div4", "expect": [ "sibling-div4" ], "level": 3 }, { "name": "General sibling combinator, matching element with id that is a sibling of an element with id", "selector": "#sibling-div2~#sibling-div4", "expect": [ "sibling-div4" ], "level": 3 }, { "name": "General sibling combinator, matching element with class that is a sibling of an element with id", "selector": "#sibling-div2~.sibling-div", "expect": [ "sibling-div4", "sibling-div6" ], "level": 3 }, { "name": "General sibling combinator, matching p element that is a sibling of a div element", "selector": "#sibling div~p", "expect": [ "sibling-p2", "sibling-p3" ], "level": 3 }, { "name": "General sibling combinator, not matching element with id that is not a sibling after a p element", "selector": "#sibling>p~div", "expect": [], "level": 3 }, { "name": "General sibling combinator, not matching element with id that is not a sibling after an element with id", "selector": "#sibling-div2~#sibling-div3, #sibling-div2~#sibling-div1", "expect": [], "level": 3 }, { "name": "General sibling combinator, surrounded by whitespace", "selector": "#sibling-p2\t\r\n~\t\r\n#sibling-p3", "expect": [ "sibling-p3" ], "level": 3 }, { "name": "General sibling combinator, whitespace after", "selector": "#sibling-p2~\t\r\n#sibling-p3", "expect": [ "sibling-p3" ], "level": 3 }, { "name": "General sibling combinator, whitespace before", "selector": "#sibling-p2\t\r\n~#sibling-p3", "expect": [ "sibling-p3" ], "level": 3 }, { "name": "General sibling combinator, no whitespace", "selector": "#sibling-p2~#sibling-p3", "expect": [ "sibling-p3" ], "level": 3 }, { "name": "Syntax, group of selectors separator, surrounded by whitespace", "selector": "#group em\t\r \n,\t\r \n#group strong", "expect": [ "group-em1", "group-strong1" ], "level": 1 }, { "name": "Syntax, group of selectors separator, whitespace after", "selector": "#group em,\t\r\n#group strong", "expect": [ "group-em1", "group-strong1" ], "level": 1 }, { "name": "Syntax, group of selectors separator, whitespace before", "selector": "#group em\t\r\n,#group strong", "expect": [ "group-em1", "group-strong1" ], "level": 1 }, { "name": "Syntax, group of selectors separator, no whitespace", "selector": "#group em,#group strong", "expect": [ "group-em1", "group-strong1" ], "level": 1 } ]