VBA 目前支持哪些 CSS 选择器?

QHa*_*arr 4 vba mshtml css-selectors queryselector

早在 2021 年 5 月 19 日,我就最近(21 年 4 月至 5 月)对与延迟绑定引用相关的接口的可疑更改写了问答mshtml.dll。如果您愿意,这是第 2 部分。

以前,在诸如thisthis 之类的问题中,我曾指出缺乏对各种 CSS 选择器的支持mshtml.dll,尤其是关于伪类。在上述问题中,我强调了这一点nth-child()nth-of-type()但并未针对MSHTML.

通常情况下,这表现在这里,不支持选择语法可以导致:

运行时错误“-2140143604 (8070000c)”:由于错误 8070000c,无法完成操作。

我希望有些事情会因为不再支持相关的各种版本/平台而中断Internet Explorer (IE)(这MSHTML与 - 请参阅我的this。我没想到的是最近对支持的 CSS 选择器的改进。以以下示例为例:

Option Explicit

''Required references:
'' Microsoft HTML Object Library

Public Sub CssTest()

    Const URL = "https://books.toscrape.com/"
    Dim html As MSHTML.HTMLDocument
   
    Set html = New MSHTML.HTMLDocument

    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", URL, False
        .send
        html.body.innerHTML = .responseText
    End With
    
    Debug.Print html.querySelector("meta:nth-of-type(2)").outerHTML
    
End Sub
Run Code Online (Sandbox Code Playgroud)

在 21 年 4 月至 5 月之前,由于使用了未实现的语法,这会出错。现在,在我的设置中,我mshtml.dll在 5 月初(最新)看到更新,我得到的结果与我通过自动化 Internet Explorer 实例运行它时得到的结果相同,它已经得到支持:

<meta name="created" content="24th Jun 2016 09:29">
Run Code Online (Sandbox Code Playgroud)

那么,目前支持 VBA 的 CSS 选择器有哪些?

我已经涵盖了“我们为什么关心?” 在之前的问答中,这里不再重复。但是,我将重新说明我的设置:

我的设置:

OS Name Microsoft Windows 10 Pro
Version 10.0.19042 Build 19042
System Type x64-based PC
Microsoft® Excel® 2019 MSO (16.0.13929.20206) 32-bit (Microsoft Office Professional Plus)
Version 2104 Build 13929.20373
mshtml.dll file  11.00.19041.985
ieframe.dll file 11.0.19041.964
Run Code Online (Sandbox Code Playgroud)

回馈:

与之前的问答一样,对于没有/没有看到这些更改的设置,我将不胜感激。我将对此添加反馈以供其他人参考。

QHa*_*arr 5

tl;博士;

对 css 选择器和 for Element.querySelector( 允许在链接querySelector(All)调用中具有更大的灵活性。这极大地增强了MSHTML类的表达能力,就 CSS 选择器而言,并使其与Selenium Basic.


动机:

由于缺乏与 VBA 相关的文档,以及学习什么有效什么无效的反复试验性质,我一直想写一个支持选择器的列表。这个最新的变化促使我这样做,并包括那些目前支持在其中使用 CSS 选择器的库。


警告:

  1. 这并不详尽;它非常全面。
  2. 如果您发现任何错误,尤其是关于 Selenium Basic 的错误,我必须凭记忆编写,请通知我,我将进行相应的编辑。
  3. 最近的变化,由汇总表中的阴影单元格表示 (JSFiddle)| 用 ?* 标记,在下面的简化表中,是因为它们与我的设置有关,在这个时间点。您的里程可能会有所不同,例如,根本不支持 CSS 选择器 < IE8。

之前和之后:

传统上,VBA 中 CSS 选择器的表现力如下,就支持它们的库而言:

在此处输入图片说明

Selenium 实现了迄今为止最多的 CSS 选择器。

当前状态:

我认为已实现的选择器的当前状态如下(对于图像质量很抱歉,即使您单击放大表格 - 请参阅JSFiddle以获得最清晰的表格视图):

在此处输入图片说明

我也将其作为简化的 HTML 插入包含在内,因此您可以单击超链接。请点击Run code snippet下面的代码插入,然后点击整链接。抱歉,表格很大,我什至没有涵盖所有可以想到的选择器 - 只有我认为可能经常使用的主要选择器。插入一个花哨的表格让我超出了身体字符的限制,所以我们到了。对于精美的表格,请参阅此JSFiddle - 新支持的表格带有阴影。

<!DOCTYPE html>
<html>
<head>
    <title>VBA: Valid CSS Selectors 2021-05-30</title>
</head>
<body>
    <h1>VBA: Valid CSS Selectors 2021-05-30</h1>
    <table>
        <tr>
            <td colspan="2">
                <a href="https://drafts.csswg.org/selectors-3/">Selectors Level 3 Specification</a>
            </td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>Pattern</td>
            <td>Represents</td>
            <td>Description</td>
            <td>Level</td>
            <td>Microsoft HTML Object Library (MSHTML)</td>
            <td>Microsoft Internet Explorer Controls (SHDocVw)</td>
            <td>Selenium Type Library (Selenium)</td>
            <td>Remarks</td>
        </tr>
        <tr>
            <td>*</td>
            <td>any element</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#universal-selector">Universal selector</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E</td>
            <td>an element of type E</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#type-selectors">Type selector</a>
            </td>
            <td>1</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo]</td>
            <td>an E element with a "foo" attribute</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo="bar"]</td>
            <td>an E element whose "foo" attribute value is exactly equal to "bar"</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo~="bar"]</td>
            <td>an E element whose "foo" attribute value is a list of whitespace-separated values, one of which is exactly equal to "bar"</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo^="bar"]</td>
            <td>an E element whose "foo" attribute value begins exactly with the string "bar"</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>3</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo$="bar"]</td>
            <td>an E element whose "foo" attribute value ends exactly with the string "bar"</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>3</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo*="bar"]</td>
            <td>an E element whose "foo" attribute value contains the substring "bar"</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>3</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[foo|="en"]</td>
            <td>an E element whose "foo" attribute has a hyphen-separated list of values beginning (from the left) with "en"</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>2</td>
            <td>x</td>
            <td>x</td>
            <td>x</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E[attr operator value i]</td>
            <td>value compared case-insensitively (ASCII range).</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>4</td>
            <td>x</td>
            <td>x</td>
            <td>?</td>
            <td>
                <a href="https://www.w3.org/TR/selectors-4/#attribute-case">i identifier</a>
            </td>
        </tr>
        <tr>
            <td>E[attr operator value s]</td>
            <td>value compared case-sensitively (ASCII range).</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#attribute-selectors">Attribute selectors</a>
            </td>
            <td>4</td>
            <td>x</td>
            <td>x</td>
            <td>x</td>
            <td>
                <a href="https://www.w3.org/TR/selectors-4/#attribute-case">s identifier</a>
            </td>
        </tr>
        <tr>
            <td>E:root</td>
            <td>an E element, root of the document</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>HTML node only</td>
        </tr>
        <tr>
            <td>E:nth-child(n)</td>
            <td>an E element, the n-th child of its parent</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>nth-child(odd) and (even) as well as nth-child(range) also supported</td>
        </tr>
        <tr>
            <td>E:nth-last-child(n)</td>
            <td>an E element, the n-th child of its parent, counting from the last one</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:nth-of-type(n)</td>
            <td>an E element, the n-th sibling of its type</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:nth-last-of-type(n)</td>
            <td>an E element, the n-th sibling of its type, counting from the last one</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:first-child</td>
            <td>an E element, first child of its parent</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:last-child</td>
            <td>an E element, last child of its parent</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:first-of-type</td>
            <td>an E element, first sibling of its type</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:last-of-type</td>
            <td>an E element, last sibling of its type</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:only-child</td>
            <td>an E element, only child of its parent</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:only-of-type</td>
            <td>an E element, only sibling of its type</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:empty</td>
            <td>an E element that has no children (including text nodes)</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#structural-pseudos">Structural pseudo-classes</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:link</td>
            <td rowspan="2">an E element being the source anchor of a hyperlink of which the target is not yet visited (:link) or already visited (:visited)</td>
            <td rowspan="2">
                <a href="https://drafts.csswg.org/selectors-3/#link">The link pseudo-classes</a>
            </td>
            <td>1</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:visited</td>
            <td>1</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E:not(s)</td>
            <td>an E element that does not match simple selector s</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#negation">Negation pseudo-class</a>
            </td>
            <td>3</td>
            <td>?*</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E F</td>
            <td>an F element descendant of an E element</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#descendant-combinators">Descendant combinator</a>
            </td>
            <td>1</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E &gt; F</td>
            <td>an F element child of an E element</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#child-combinators">Child combinator</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E + F</td>
            <td>an F element immediately preceded by an E element</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#adjacent-sibling-combinators">Next-sibling combinator</a>
            </td>
            <td>2</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>E ~ F</td>
            <td>an F element preceded by an E element</td>
            <td>
                <a href="https://drafts.csswg.org/selectors-3/#general-sibling-combinators">Subsequent-sibling combinator</a>
            </td>
            <td>3</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>foo, bar</td>
            <td>foo, bar&nbsp;will match both&nbsp;&lt;foo&gt;&nbsp;and&nbsp;&lt;bar&gt;&nbsp;elements.</td>
            <td>
                <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Selector_list">Selector list</a>
            </td>
            <td>1</td>
            <td>?</td>
            <td>?</td>
            <td>?</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td>


Copyright Info

© Copyright 2013-2021 admin@qa.1r1g.com

如未特别说明,本网站的内容使用如下协议:
Creative Commons Atution-NonCommercial-ShareAlike 4.0 International license
.

用以下方式浏览
回到顶部