Skip to content

Commit bf8144b

Browse files
author
Rahim Abdi
committed
Automation: Add support for GetAccessibilityPropertiesForElement, GetAccessibilityPropertiesForAccessibilityNode commands
https://bugs.webkit.org/show_bug.cgi?id=299508 rdar://161303091 Reviewed by NOBODY (OOPS!). This patch implements two new WebDriver automation commands used to support more robust WPT accessibility testing: - GetAccessibilityPropertiesForElement - GetAccessibilityPropertiesForAccessibilityNode For this initial implementation, the Automation protocol returns an accessibility property bag (surfaced to WPT via test_driver.get_accessibility_properties...()) containing the following computed properties: - accessibilityNodeId - role - label - checked ("true", "false", or "mixed"; omitted if the node does not support a checked state) - pressed ("true", "false", or "mixed"; omitted if the node is not a toggle button) - children (array of accessibility node handles) - parent (accessibility node handle; omitted if the node has no parent) As these new WebDriver commands are test-only interfaces, there's been in-depth discussion around how to treat computed AX properties when a property is missing and supported, or present & unsupported; see WICG/aom#203 Some additional resources: - WebDriver PR for the new commands: w3c/webdriver#1960 - ARIA PR for the initial set of computed accessibility properties, and treatment of undefined/missing/unsupported values: w3c/aria#2800 At a high level, the WebDriver client (i.e., Web Platform Tests' testdriver.js) initiates these new commands, which are then dispatched to the UIProcess (WebAutomationSession). The WebAutomationSession then parses the payload and extracts the protocol-specific element or accessibility node, after which it identifies the target (WebPageProxy), which invokes an asynchronous IPC message to the corresponding WebProcess. Since an AXID is only unique within a single WebProcess, accessibility nodes are identified by opaque handles that also encode the hosting process and frame. The UIProcess validates the handle (frame still exists, belongs to the page, and is still hosted by that process) and routes GetAccessibilityPropertiesForAccessibilityNode to the process containing that frame; the WebProcess only resolves the AXID within that frame's document. Parent and children are computed from the unignored tree using the cross-frame accessors (now exported from WebCore), so they can cross frames hosted by the same process. With site isolation, a frame hosted by another process appears as a childless RemoteFrame node; walking across process boundaries is not yet supported and will be addressed in a follow-up: https://bugs.webkit.org/show_bug.cgi?id=327631. The WebProcess returns the computed accessibility properties to the UIProcess as a typed "ComputedAccessibilityProperties" struct (Source/WebKit/Shared/Automation), using frame-qualified AXIDs and an AccessibilityTriState enum rather than strings; the UIProcess converts these to strings when building the protocol object. WebCore::AXID is registered as an IPC-serialized identifier in messages.py. Note that to fully support these new WebDriver commands, corresponding WebDriver HTTP endpoints must be implemented in Webdriver for Safari (safaridriver): - /session/{session id}/element/{element id}/accessibilityproperties: Returns accessibility properties for DOM element {element id} - /session/{session id}/accessibility/properties/{accessibility id}: Returns accessibility properties for accessibility node {accessibility id} Due to the existence of two AccessibilityProperties protocol object definitions, documentation for each has also been updated: - Source/WebKit/UIProcess/Automation/Automation.json — specification conformance and interoperability testing - Source/JavaScriptCore/inspector/protocol/DOM.json — Web Inspector DOM element inspection As an unrelated small fix, the return type for GetComputedLabel (WebAutomationSessionProxy IPC message) incorrectly names the first string parameter as "role" instead of "label" so this patch also corrects the tuple to return (label, errorType). New API tests (WebAutomationAccessibility) cover a cross-origin iframe with and without site isolation, checked/pressed states, forged and stale handles, and malformed handles. * Source/JavaScriptCore/inspector/protocol/DOM.json: * Source/WebCore/accessibility/AXCoreObject.h: * Source/WebKit/CMakeLists.txt: * Source/WebKit/DerivedSources-input.xcfilelist: * Source/WebKit/DerivedSources.make: * Source/WebKit/Scripts/webkit/messages.py: (serialized_identifiers): (types_that_cannot_be_forward_declared): (headers_for_type): * Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp: (IPC::serializedIdentifiers): * Source/WebKit/Shared/Automation/ComputedAccessibilityProperties.h: Added. * Source/WebKit/Shared/Automation/ComputedAccessibilityProperties.serialization.in: Added. * Source/WebKit/UIProcess/Automation/Automation.json: * Source/WebKit/UIProcess/Automation/WebAutomationSession.cpp: (WebKit::makeAccessibilityNodeHandle): (WebKit::parseAccessibilityNodeHandle): (WebKit::stringForAccessibilityTriState): (WebKit::makeAccessibilityPropertiesCompletionHandler): (WebKit::WebAutomationSession::getAccessibilityPropertiesForElement): (WebKit::WebAutomationSession::getAccessibilityPropertiesForAccessibilityNode): * Source/WebKit/UIProcess/Automation/WebAutomationSession.h: * Source/WebKit/UIProcess/WebPageProxy.cpp: * Source/WebKit/WebKit.xcodeproj/project.pbxproj: * Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp: (WebKit::performDeferredAccessibilityCacheUpdates): (WebKit::WebAutomationSessionProxy::getAccessibilityObjectForAXID): (WebKit::toAccessibilityTriState): (WebKit::accessibilityNodeReference): (WebKit::getComputedAccessibilityProperties): (WebKit::WebAutomationSessionProxy::getAccessibilityPropertiesForElement): (WebKit::WebAutomationSessionProxy::getAccessibilityPropertiesForAccessibilityNode): * Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.h: * Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.messages.in: * Tools/TestWebKitAPI/SourcesCocoa.txt: * Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WebAutomationAccessibility.mm: Added. (TestWebKitAPI::decodeAccessibilityNodeHandle): (TestWebKitAPI::encodeAccessibilityNodeHandle): (TestWebKitAPI::frameIDForFrameInfo): (TestWebKitAPI::WebAutomationAccessibility::WebAutomationAccessibility): (TestWebKitAPI::WebAutomationAccessibility::~WebAutomationAccessibility): (TestWebKitAPI::WebAutomationAccessibility::sendCommand): (TestWebKitAPI::WebAutomationAccessibility::frameHandleForChildFrame): (TestWebKitAPI::WebAutomationAccessibility::nodeHandleForElement): (TestWebKitAPI::WebAutomationAccessibility::propertiesForElement): (TestWebKitAPI::WebAutomationAccessibility::propertiesForAccessibilityNode): (TestWebKitAPI::WebAutomationAccessibility::removeIframe): (TestWebKitAPI::WebAutomationAccessibility::mainFrameID const): (TestWebKitAPI::WebAutomationAccessibility::childFrameID const): (TestWebKitAPI::WebAutomationAccessibility::mainFramePID const): (TestWebKitAPI::WebAutomationAccessibility::childFramePID const): (TestWebKitAPI::properties): (TestWebKitAPI::errorMessage): (TestWebKitAPI::expectError): (TestWebKitAPI::walkAccessibilityTree): (TestWebKitAPI::runRoundTripTest): (TestWebKitAPI::TEST(WebAutomationAccessibility, CrossOriginIframe)): (TestWebKitAPI::TEST(WebAutomationAccessibility, CrossOriginIframeWithSiteIsolation)): (TestWebKitAPI::TEST(WebAutomationAccessibility, CheckedAndPressedStates)): (TestWebKitAPI::TEST(WebAutomationAccessibility, MalformedAccessibilityNodeHandle)):
1 parent 733b18f commit bf8144b

19 files changed

Lines changed: 855 additions & 4 deletions

‎Source/JavaScriptCore/inspector/protocol/DOM.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@
101101
},
102102
{
103103
"id": "AccessibilityProperties",
104-
"description": "A structure holding accessibility properties.",
104+
"description": "A structure holding accessibility properties, either forwarded to the DOM Element from its backing Accessibility Node, and/or some local properties (e.g., ignored) that may clarify other characteristics, such as why a backing Accessibility Node is not available for this DOM Element.",
105105
"type": "object",
106106
"properties": [
107107
{ "name": "activeDescendantNodeId", "$ref": "NodeId", "optional": true, "description": "<code>DOMNode</code> id of the accessibility object referenced by aria-activedescendant." },

‎Source/WebCore/accessibility/AXCoreObject.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -901,13 +901,13 @@ class AXCoreObject : public RefCountedAndCanMakeWeakPtr<AXCoreObject> {
901901

902902
// Helpers that run on any platform and return children and parents, calling the cross frame functions if needed
903903
// to walk between LocalFrames.
904-
AccessibilityChildrenVector crossFrameUnignoredChildren();
904+
WEBCORE_EXPORT AccessibilityChildrenVector crossFrameUnignoredChildren();
905905
size_t crossFrameUnignoredChildrenCount();
906906
// Whether this object hosts a cross-frame subtree that crossFrameUnignoredChildren() hoists.
907907
// Returns std::nullopt when the implementation can not cheaply determine (i.e. from a cache)
908908
// whether a cross-frame child is present.
909909
virtual std::optional<bool> cachedHasCrossFrameChild();
910-
AXCoreObject* crossFrameParentObjectUnignored() const;
910+
WEBCORE_EXPORT AXCoreObject* crossFrameParentObjectUnignored() const;
911911
AccessibilityChildrenVector crossFrameChildrenIncludingIgnored(bool updateChildrenIfNeeded = true);
912912
bool crossFrameIsAncestorOfObject(const AXCoreObject&) const;
913913
bool crossFrameIsDescendantOfObject(const AXCoreObject&) const;

‎Source/WebKit/CMakeLists.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,8 @@ set(WebKit_SERIALIZATION_IN_FILES
606606

607607
Shared/Authentication/AuthenticationChallengeDisposition.serialization.in
608608

609+
Shared/Automation/ComputedAccessibilityProperties.serialization.in
610+
609611
Shared/Databases/IndexedDB/WebIDBResult.serialization.in
610612

611613
Shared/Extensions/WebExtensionActionClickBehavior.serialization.in

‎Source/WebKit/DerivedSources-input.xcfilelist‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ $(PROJECT_DIR)/Shared/ApplePay/ApplePayPaymentSetupFeatures.serialization.in
249249
$(PROJECT_DIR)/Shared/ApplePay/PaymentSetupConfiguration.serialization.in
250250
$(PROJECT_DIR)/Shared/ApplePay/WebPaymentCoordinatorProxy.messages.in
251251
$(PROJECT_DIR)/Shared/Authentication/AuthenticationChallengeDisposition.serialization.in
252+
$(PROJECT_DIR)/Shared/Automation/ComputedAccessibilityProperties.serialization.in
252253
$(PROJECT_DIR)/Shared/AuxiliaryProcess.messages.in
253254
$(PROJECT_DIR)/Shared/AuxiliaryProcessCreationParameters.serialization.in
254255
$(PROJECT_DIR)/Shared/BackgroundFetchChange.serialization.in

‎Source/WebKit/DerivedSources.make‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,7 @@ SERIALIZATION_DESCRIPTION_FILES = \
705705
Shared/AlternativeTextClient.serialization.in \
706706
Shared/AppPrivacyReportTestingData.serialization.in \
707707
Shared/Authentication/AuthenticationChallengeDisposition.serialization.in \
708+
Shared/Automation/ComputedAccessibilityProperties.serialization.in \
708709
Shared/BackgroundFetchChange.serialization.in \
709710
Shared/BackgroundFetchState.serialization.in \
710711
Shared/CacheModel.serialization.in \

‎Source/WebKit/Scripts/webkit/messages.py‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ def serialized_identifiers():
437437
# FIXME: This can be derived from *.serialization.in files.
438438
return [
439439
'IPC::AsyncReplyID',
440+
'WebCore::AXID',
440441
'WebCore::AgentClusterIdentifier',
441442
'WebCore::AttributedStringTextListID',
442443
'WebCore::AttributedStringTextTableBlockID',
@@ -620,6 +621,7 @@ def types_that_cannot_be_forward_declared():
620621
'PlatformXR::TransientInputHitTestSource',
621622
'PlatformXR::VisibilityState',
622623
'String',
624+
'WebCore::AXID',
623625
'WebCore::BackForwardFrameItemIdentifier',
624626
'WebCore::BackForwardItemIdentifier',
625627
'WebCore::ColorSpace',
@@ -1388,6 +1390,7 @@ def headers_for_type(type, for_implementation_file=False):
13881390
'WTF::UUID': ['<wtf/UUID.h>'],
13891391
'WallTime': ['<wtf/WallTime.h>'],
13901392
'WebCore::AXDebugInfo': ['<WebCore/AXObjectTypes.h>'],
1393+
'WebCore::AXID': ['<WebCore/AXID.h>'],
13911394
'WebCore::ActivityStateForCPUSampling': ['<WebCore/ActivityState.h>'],
13921395
'WebCore::AccessibilityMode': ['<WebCore/AXObjectTypes.h>'],
13931396
'WebCore::AccessibilityRemoteToken': ['<WebCore/AccessibilityRemoteToken.h>'],

‎Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -512,6 +512,7 @@ Vector<ASCIILiteral> serializedIdentifiers()
512512
{
513513
return {
514514
"IPC::AsyncReplyID"_s,
515+
"WebCore::AXID"_s,
515516
"WebCore::AgentClusterIdentifier"_s,
516517
"WebCore::AttributedStringTextListID"_s,
517518
"WebCore::AttributedStringTextTableBlockID"_s,
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright (C) 2026 Apple Inc. All rights reserved.
3+
*
4+
* Redistribution and use in source and binary forms, with or without
5+
* modification, are permitted provided that the following conditions
6+
* are met:
7+
* 1. Redistributions of source code must retain the above copyright
8+
* notice, this list of conditions and the following disclaimer.
9+
* 2. Redistributions in binary form must reproduce the above copyright
10+
* notice, this list of conditions and the following disclaimer in the
11+
* documentation and/or other materials provided with the distribution.
12+
*
13+
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15+
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17+
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23+
* THE POSSIBILITY OF SUCH DAMAGE.
24+
*/
25+
26+
#pragma once
27+
28+
#include <WebCore/AXID.h>
29+
#include <WebCore/FrameIdentifier.h>
30+
#include <WebCore/ProcessIdentifier.h>
31+
#include <optional>
32+
#include <wtf/Vector.h>
33+
#include <wtf/text/WTFString.h>
34+
35+
namespace WebKit {
36+
37+
// The value of a tristate ARIA property such as aria-checked or aria-pressed.
38+
enum class AccessibilityTriState : uint8_t {
39+
False,
40+
True,
41+
Mixed,
42+
};
43+
44+
// An AXID is only unique within the AXObjectCache that created it, so an accessibility node is
45+
// identified by the frame whose document owns it together with its AXID.
46+
struct AccessibilityNodeReference {
47+
WebCore::FrameIdentifier frameID;
48+
WebCore::AXID axID;
49+
};
50+
51+
// Computed accessibility properties sent from the WebProcess to the UIProcess for WebDriver.
52+
// When this is updated, ComputedAccessibilityProperties.serialization.in must be updated as well.
53+
struct ComputedAccessibilityProperties {
54+
// The process that computed these properties. Frames keep their FrameIdentifier across
55+
// process swaps, so the process is part of every accessibility node handle.
56+
WebCore::ProcessIdentifier processID;
57+
AccessibilityNodeReference accessibilityNode;
58+
String role;
59+
String label;
60+
std::optional<AccessibilityTriState> checked;
61+
std::optional<AccessibilityTriState> pressed;
62+
std::optional<AccessibilityNodeReference> parentAccessibilityNode;
63+
Vector<AccessibilityNodeReference> childAccessibilityNodes;
64+
};
65+
66+
} // namespace WebKit
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Copyright (C) 2026 Apple Inc. All rights reserved.
2+
#
3+
# Redistribution and use in source and binary forms, with or without
4+
# modification, are permitted provided that the following conditions
5+
# are met:
6+
# 1. Redistributions of source code must retain the above copyright
7+
# notice, this list of conditions and the following disclaimer.
8+
# 2. Redistributions in binary form must reproduce the above copyright
9+
# notice, this list of conditions and the following disclaimer in the
10+
# documentation and/or other materials provided with the distribution.
11+
#
12+
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
13+
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
14+
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
15+
# DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
16+
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
17+
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18+
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
19+
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
20+
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
21+
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22+
23+
header: "ComputedAccessibilityProperties.h"
24+
enum class WebKit::AccessibilityTriState : uint8_t {
25+
False,
26+
True,
27+
Mixed,
28+
};
29+
30+
header: "ComputedAccessibilityProperties.h"
31+
[CustomHeader] struct WebKit::AccessibilityNodeReference {
32+
WebCore::FrameIdentifier frameID;
33+
WebCore::AXID axID;
34+
};
35+
36+
header: "ComputedAccessibilityProperties.h"
37+
struct WebKit::ComputedAccessibilityProperties {
38+
WebCore::ProcessIdentifier processID;
39+
WebKit::AccessibilityNodeReference accessibilityNode;
40+
String role;
41+
String label;
42+
std::optional<WebKit::AccessibilityTriState> checked;
43+
std::optional<WebKit::AccessibilityTriState> pressed;
44+
std::optional<WebKit::AccessibilityNodeReference> parentAccessibilityNode;
45+
Vector<WebKit::AccessibilityNodeReference> childAccessibilityNodes;
46+
};

‎Source/WebKit/UIProcess/Automation/Automation.json‎

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22
"domain": "Automation",
33
"description": "Automation domain exposes commands for automating user interactions with the browser.",
44
"types": [
5+
{
6+
"id": "AccessibilityProperties",
7+
"type": "object",
8+
"description": "Snapshot of a DOM node's computed accessibility properties used in WebDriver contexts.",
9+
"properties": [
10+
{ "name": "accessibilityNodeId", "type": "string", "description": "The opaque handle of the accessibility node. The handle identifies the frame that contains the node." },
11+
{ "name": "role", "type": "string", "description": "The computed role." },
12+
{ "name": "label", "type": "string", "description": "The computed label." },
13+
{ "name": "checked", "type": "string", "optional": true, "description": "The checked state (\"true\", \"false\", or \"mixed\"). Omitted if the node does not support a checked state." },
14+
{ "name": "pressed", "type": "string", "optional": true, "description": "The pressed state (\"true\", \"false\", or \"mixed\"). Omitted if the node is not a toggle button." },
15+
{ "name": "parent", "type": "string", "optional": true, "description": "The opaque handle of the parent accessibility node, which may be in a different frame hosted by the same process. Omitted if the node has no parent, including when the node is the root of a frame whose parent frame is hosted by a different process." },
16+
{ "name": "children", "type": "array", "items": { "type": "string" }, "description": "The opaque handles of the unignored child accessibility nodes, which may be in different frames hosted by the same process. A frame hosted by a different process (for example, a cross-origin iframe with site isolation) appears as a single <code>RemoteFrame</code> node with no children." }
17+
]
18+
},
519
{
620
"id": "Point",
721
"type": "object",
@@ -736,6 +750,31 @@
736750
],
737751
"async": true
738752
},
753+
{
754+
"name": "getAccessibilityPropertiesForElement",
755+
"description": "Get computed accessibility properties for the accessibility node backing a DOM element. Use this when starting from an element reference; the returned <code>accessibilityNodeId</code>, <code>parent</code>, and <code>children</code> values can be passed to <code>getAccessibilityPropertiesForAccessibilityNode</code> to walk the accessibility tree, which may contain nodes that have no corresponding DOM element.",
756+
"parameters": [
757+
{ "name": "browsingContextHandle", "$ref": "BrowsingContextHandle", "description": "The handle for the browsing context." },
758+
{ "name": "frameHandle", "$ref": "FrameHandle", "optional": true, "description": "The handle for the frame that contains the element. The main frame is used if this parameter is empty string or excluded." },
759+
{ "name": "nodeHandle", "$ref": "NodeHandle", "description": "The handle of the element to get the accessibility properties for." }
760+
],
761+
"returns": [
762+
{ "name": "properties", "$ref": "AccessibilityProperties" }
763+
],
764+
"async": true
765+
},
766+
{
767+
"name": "getAccessibilityPropertiesForAccessibilityNode",
768+
"description": "Get computed accessibility properties for an accessibility node from WebKit's accessibility tree. Use this to inspect nodes reached via the <code>accessibilityNodeId</code>, <code>parent</code>, or <code>children</code> values returned by either accessibility properties command. Accessibility node handles identify the frame that contains the node, so no frame handle is needed.",
769+
"parameters": [
770+
{ "name": "browsingContextHandle", "$ref": "BrowsingContextHandle", "description": "The handle for the browsing context." },
771+
{ "name": "accessibilityNodeId", "type": "string", "description": "The accessibility node to get the accessibility properties for. This is an <code>accessibilityNodeId</code>, <code>parent</code>, or <code>children</code> value previously returned by an accessibility properties command." }
772+
],
773+
"returns": [
774+
{ "name": "properties", "$ref": "AccessibilityProperties" }
775+
],
776+
"async": true
777+
},
739778
{
740779
"name": "selectOptionElement",
741780
"description": "Selects the given option element. In case of container with multiple options enabled, the element selectedness is toggled.",

0 commit comments

Comments
 (0)