appium-mac2-driver 4.3.6 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/WebDriverAgentMac/IntegrationTests/AMSessionTests.m +14 -0
- package/WebDriverAgentMac/IntegrationTests/AMWindowTests.m +427 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Commands/AMWindowCommands.m +63 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Commands/FBDebugCommands.m +2 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Commands/FBSessionCommands.m +17 -5
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBCommandStatus.h +3 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBCommandStatus.m +13 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Routing/FBSession.m +5 -1
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMScreenUtils.h +4 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMScreenUtils.m +23 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.h +18 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMSnapshotUtils.m +43 -28
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMWindowUtils.h +111 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMWindowUtils.m +780 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMXCTAccessibility.h +61 -0
- package/WebDriverAgentMac/WebDriverAgentLib/Utilities/AMXCTAccessibility.m +108 -0
- package/WebDriverAgentMac/WebDriverAgentMac.xcodeproj/project.pbxproj +20 -0
- package/build/lib/commands/native-record-screen.d.ts +2 -0
- package/build/lib/commands/native-record-screen.d.ts.map +1 -1
- package/build/lib/commands/native-record-screen.js.map +1 -1
- package/build/lib/commands/windows.d.ts +22 -0
- package/build/lib/commands/windows.d.ts.map +1 -0
- package/build/lib/commands/windows.js +32 -0
- package/build/lib/commands/windows.js.map +1 -0
- package/build/lib/driver.d.ts +15 -0
- package/build/lib/driver.d.ts.map +1 -1
- package/build/lib/driver.js +55 -32
- package/build/lib/driver.js.map +1 -1
- package/build/lib/execute-method-map.d.ts +9 -0
- package/build/lib/execute-method-map.d.ts.map +1 -1
- package/build/lib/execute-method-map.js +9 -0
- package/build/lib/execute-method-map.js.map +1 -1
- package/build/lib/session-claim-handler.d.ts +41 -0
- package/build/lib/session-claim-handler.d.ts.map +1 -0
- package/build/lib/session-claim-handler.js +236 -0
- package/build/lib/session-claim-handler.js.map +1 -0
- package/build/lib/types.d.ts +26 -0
- package/build/lib/types.d.ts.map +1 -1
- package/build/lib/wda-mac.d.ts +6 -2
- package/build/lib/wda-mac.d.ts.map +1 -1
- package/build/lib/wda-mac.js +39 -9
- package/build/lib/wda-mac.js.map +1 -1
- package/lib/commands/native-record-screen.ts +2 -0
- package/lib/commands/windows.ts +44 -0
- package/lib/driver.ts +59 -31
- package/lib/execute-method-map.ts +9 -0
- package/lib/session-claim-handler.ts +306 -0
- package/lib/types.ts +28 -0
- package/lib/wda-mac.ts +41 -10
- package/node_modules/appium-xcode/CHANGELOG.md +7 -0
- package/node_modules/appium-xcode/package.json +4 -4
- package/node_modules/async-lock/AUTHORS +21 -0
- package/node_modules/async-lock/History.md +132 -0
- package/node_modules/async-lock/LICENSE +22 -0
- package/node_modules/async-lock/README.md +177 -0
- package/node_modules/async-lock/index.js +2 -0
- package/node_modules/async-lock/lib/index.js +312 -0
- package/node_modules/async-lock/package.json +48 -0
- package/node_modules/bare-fs/binding.c +1 -1
- package/node_modules/bare-fs/index.js +30 -6
- package/node_modules/bare-fs/package.json +1 -1
- package/node_modules/bare-fs/prebuilds/android-arm/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/android-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/android-ia32/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/android-x64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/darwin-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/darwin-x64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/ios-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/ios-arm64-simulator/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/ios-x64-simulator/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/linux-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/linux-x64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/win32-arm64/bare-fs.bare +0 -0
- package/node_modules/bare-fs/prebuilds/win32-x64/bare-fs.bare +0 -0
- package/node_modules/bare-url/README.md +4 -0
- package/node_modules/bare-url/index.d.ts +3 -0
- package/node_modules/bare-url/index.js +42 -18
- package/node_modules/bare-url/lib/errors.js +4 -0
- package/node_modules/bare-url/package.json +1 -1
- package/node_modules/bare-url/prebuilds/android-arm/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/android-arm64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/android-ia32/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/android-x64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/darwin-arm64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/darwin-x64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/ios-arm64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/ios-arm64-simulator/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/ios-x64-simulator/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/linux-arm64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/linux-x64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/win32-arm64/bare-url.bare +0 -0
- package/node_modules/bare-url/prebuilds/win32-x64/bare-url.bare +0 -0
- package/node_modules/readable-stream/lib/internal/shims/process.js +19 -0
- package/node_modules/readable-stream/lib/internal/streams/destroy.js +1 -1
- package/node_modules/readable-stream/lib/internal/streams/duplexify.js +1 -1
- package/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +1 -1
- package/node_modules/readable-stream/lib/internal/streams/from.js +1 -1
- package/node_modules/readable-stream/lib/internal/streams/legacy.js +6 -1
- package/node_modules/readable-stream/lib/internal/streams/pipeline.js +1 -1
- package/node_modules/readable-stream/lib/internal/streams/readable.js +1 -1
- package/node_modules/readable-stream/lib/internal/streams/writable.js +1 -1
- package/node_modules/readable-stream/package.json +3 -2
- package/node_modules/tar-stream/package.json +7 -7
- package/package.json +6 -3
- package/scripts/setup-accessibility.mjs +175 -0
|
@@ -72,6 +72,11 @@ static FBSession *_activeSession = nil;
|
|
|
72
72
|
[self.testedApplication terminate];
|
|
73
73
|
}
|
|
74
74
|
self.testedApplication = nil;
|
|
75
|
+
[self.elementCache reset];
|
|
76
|
+
// The recording belongs to the active session, so a stale one must not touch it
|
|
77
|
+
if (_activeSession != self) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
75
80
|
FBScreenRecordingContainer *screenRecordingContainer = FBScreenRecordingContainer.sharedInstance;
|
|
76
81
|
NSUUID *videoRecordingId = screenRecordingContainer.screenRecordingPromise.identifier;
|
|
77
82
|
if (nil != videoRecordingId) {
|
|
@@ -83,7 +88,6 @@ static FBSession *_activeSession = nil;
|
|
|
83
88
|
if (nil != screenRecordingContainer.screenRecordingPromise) {
|
|
84
89
|
[screenRecordingContainer reset];
|
|
85
90
|
}
|
|
86
|
-
[self.elementCache reset];
|
|
87
91
|
_activeSession = nil;
|
|
88
92
|
}
|
|
89
93
|
|
|
@@ -24,6 +24,10 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
24
24
|
@property (readonly, nonatomic) BOOL isMain;
|
|
25
25
|
/** The integer identifier of a screen */
|
|
26
26
|
@property (readonly, nonatomic) long long identifier;
|
|
27
|
+
/** The display bounds in the global coordinate space with the top-left origin (same as XCUIElement frames) */
|
|
28
|
+
@property (readonly, nonatomic) CGRect bounds;
|
|
29
|
+
/** Same as bounds, but without the menu bar and the Dock */
|
|
30
|
+
@property (readonly, nonatomic) CGRect visibleBounds;
|
|
27
31
|
|
|
28
32
|
@end
|
|
29
33
|
|
|
@@ -18,6 +18,29 @@
|
|
|
18
18
|
|
|
19
19
|
@implementation AMScreenProperties
|
|
20
20
|
|
|
21
|
+
- (CGRect)bounds
|
|
22
|
+
{
|
|
23
|
+
return CGDisplayBounds((CGDirectDisplayID)self.identifier);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
- (CGRect)visibleBounds
|
|
27
|
+
{
|
|
28
|
+
CGRect bounds = self.bounds;
|
|
29
|
+
for (NSScreen *screen in NSScreen.screens) {
|
|
30
|
+
if ([screen.deviceDescription[@"NSScreenNumber"] longLongValue] != self.identifier) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
// NSScreen uses the bottom-left origin of the primary screen, which is the first one
|
|
34
|
+
CGFloat primaryHeight = NSScreen.screens.firstObject.frame.size.height;
|
|
35
|
+
CGRect visible = screen.visibleFrame;
|
|
36
|
+
return CGRectMake(visible.origin.x,
|
|
37
|
+
primaryHeight - CGRectGetMaxY(visible),
|
|
38
|
+
visible.size.width,
|
|
39
|
+
visible.size.height);
|
|
40
|
+
}
|
|
41
|
+
return bounds;
|
|
42
|
+
}
|
|
43
|
+
|
|
21
44
|
- (instancetype)initWithIdentifier:(long long)identifier
|
|
22
45
|
isMain:(BOOL)isMain
|
|
23
46
|
{
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* limitations under the License.
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
+
#import <ApplicationServices/ApplicationServices.h>
|
|
17
18
|
#import <XCTest/XCTest.h>
|
|
18
19
|
|
|
19
20
|
NS_ASSUME_NONNULL_BEGIN
|
|
@@ -79,6 +80,23 @@ NS_ASSUME_NONNULL_BEGIN
|
|
|
79
80
|
*/
|
|
80
81
|
+ (nullable NSString *)domIdentifierWithSnapshot:(nullable id)snapshot;
|
|
81
82
|
|
|
83
|
+
/**
|
|
84
|
+
Creates an AX element for the given snapshot. The caller owns the result and must CFRelease it.
|
|
85
|
+
|
|
86
|
+
@param snapshot snapshot instance to create the AX element for
|
|
87
|
+
@return The AX element or NULL if this process lacks Accessibility permission or the element is unavailable
|
|
88
|
+
*/
|
|
89
|
+
+ (nullable AXUIElementRef)createAXElementWithSnapshot:(nullable id)snapshot CF_RETURNS_RETAINED;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
Creates an AX element for the XCTest accessibility element (XCAccessibilityElement).
|
|
93
|
+
The caller owns the result and must CFRelease it.
|
|
94
|
+
|
|
95
|
+
@param element XCTest accessibility element
|
|
96
|
+
@return The AX element or NULL if this process lacks Accessibility permission or the element is unavailable
|
|
97
|
+
*/
|
|
98
|
+
+ (nullable AXUIElementRef)createAXElementWithAccessibilityElement:(nullable id)element CF_RETURNS_RETAINED;
|
|
99
|
+
|
|
82
100
|
@end
|
|
83
101
|
|
|
84
102
|
NS_ASSUME_NONNULL_END
|
|
@@ -114,43 +114,58 @@ static BOOL AMIsAccessibilityTrusted(void)
|
|
|
114
114
|
: matchingElements.copy;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
+ (nullable
|
|
117
|
+
+ (nullable AXUIElementRef)createAXElementWithSnapshot:(nullable id)snapshot
|
|
118
118
|
{
|
|
119
|
-
if (nil == snapshot
|
|
120
|
-
return
|
|
119
|
+
if (nil == snapshot) {
|
|
120
|
+
return NULL;
|
|
121
|
+
}
|
|
122
|
+
@try {
|
|
123
|
+
return [self createAXElementWithAccessibilityElement:[snapshot valueForKey:@"_accessibilityElement"]];
|
|
124
|
+
} @catch (NSException *e) {
|
|
125
|
+
// Only the private _accessibilityElement key path may throw here
|
|
126
|
+
[FBLogger logFmt:@"Cannot create an AX element from a snapshot. Original error: %@", e.reason];
|
|
127
|
+
return NULL;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
+ (nullable AXUIElementRef)createAXElementWithAccessibilityElement:(nullable id)element
|
|
132
|
+
{
|
|
133
|
+
if (nil == element || !AMIsAccessibilityTrusted()) {
|
|
134
|
+
return NULL;
|
|
121
135
|
}
|
|
122
136
|
AMCreateWithRemoteTokenFn createRef = AMRemoteTokenFn();
|
|
123
137
|
if (NULL == createRef) {
|
|
124
|
-
return
|
|
138
|
+
return NULL;
|
|
125
139
|
}
|
|
126
|
-
|
|
127
140
|
@try {
|
|
128
|
-
NSData *token = [
|
|
129
|
-
|
|
130
|
-
return nil;
|
|
131
|
-
}
|
|
132
|
-
AXUIElementRef ref = createRef((__bridge CFDataRef)token);
|
|
133
|
-
if (NULL == ref) {
|
|
134
|
-
return nil;
|
|
135
|
-
}
|
|
136
|
-
CFTypeRef value = NULL;
|
|
137
|
-
AXError err = AXUIElementCopyAttributeValue(ref,
|
|
138
|
-
(__bridge CFStringRef)AM_DOM_IDENTIFIER_ATTRIBUTE,
|
|
139
|
-
&value);
|
|
140
|
-
CFRelease(ref);
|
|
141
|
-
if (kAXErrorSuccess != err || NULL == value) {
|
|
142
|
-
return nil;
|
|
143
|
-
}
|
|
144
|
-
NSString *result = [(__bridge id)value isKindOfClass:NSString.class]
|
|
145
|
-
? [(__bridge NSString *)value copy]
|
|
146
|
-
: nil;
|
|
147
|
-
CFRelease(value);
|
|
148
|
-
return result.length > 0 ? result : nil;
|
|
141
|
+
NSData *token = [element valueForKey:@"_token"];
|
|
142
|
+
return [token isKindOfClass:NSData.class] ? createRef((__bridge CFDataRef)token) : NULL;
|
|
149
143
|
} @catch (NSException *e) {
|
|
150
|
-
// Only the private
|
|
151
|
-
[FBLogger logFmt:@"Cannot
|
|
144
|
+
// Only the private _token key path may throw here
|
|
145
|
+
[FBLogger logFmt:@"Cannot create an AX element from an accessibility element. Original error: %@", e.reason];
|
|
146
|
+
return NULL;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
+ (nullable NSString *)domIdentifierWithSnapshot:(nullable id)snapshot
|
|
151
|
+
{
|
|
152
|
+
AXUIElementRef ref = [self createAXElementWithSnapshot:snapshot];
|
|
153
|
+
if (NULL == ref) {
|
|
154
|
+
return nil;
|
|
155
|
+
}
|
|
156
|
+
CFTypeRef value = NULL;
|
|
157
|
+
AXError err = AXUIElementCopyAttributeValue(ref,
|
|
158
|
+
(__bridge CFStringRef)AM_DOM_IDENTIFIER_ATTRIBUTE,
|
|
159
|
+
&value);
|
|
160
|
+
CFRelease(ref);
|
|
161
|
+
if (kAXErrorSuccess != err || NULL == value) {
|
|
152
162
|
return nil;
|
|
153
163
|
}
|
|
164
|
+
NSString *result = [(__bridge id)value isKindOfClass:NSString.class]
|
|
165
|
+
? [(__bridge NSString *)value copy]
|
|
166
|
+
: nil;
|
|
167
|
+
CFRelease(value);
|
|
168
|
+
return result.length > 0 ? result : nil;
|
|
154
169
|
}
|
|
155
170
|
|
|
156
171
|
@end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
3
|
+
* you may not use this file except in compliance with the License.
|
|
4
|
+
* See the NOTICE file distributed with this work for additional
|
|
5
|
+
* information regarding copyright ownership.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#import <XCTest/XCTest.h>
|
|
18
|
+
|
|
19
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
20
|
+
|
|
21
|
+
extern NSString *const AMWindowErrorDomain;
|
|
22
|
+
|
|
23
|
+
typedef NS_ENUM(NSInteger, AMWindowErrorCode) {
|
|
24
|
+
/** One of the arguments is invalid */
|
|
25
|
+
AMWindowErrorInvalidArgument = 1,
|
|
26
|
+
/** The window could not be changed, for example because the Accessibility permission is missing */
|
|
27
|
+
AMWindowErrorFailure,
|
|
28
|
+
/** The window does not exist anymore or there is no such window */
|
|
29
|
+
AMWindowErrorNotFound,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
extern NSString *const AMWindowStateNormal;
|
|
33
|
+
extern NSString *const AMWindowStateMinimized;
|
|
34
|
+
extern NSString *const AMWindowStateMaximized;
|
|
35
|
+
extern NSString *const AMWindowStateFullscreen;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
Inspects and changes application windows. Does not depend on the HTTP layer or sessions.
|
|
39
|
+
|
|
40
|
+
Whenever possible, windows are inspected and changed through the accessibility interface of XCTest,
|
|
41
|
+
which does not need the Accessibility permission: the window attributes, the minimized windows,
|
|
42
|
+
minimizing, entering and leaving the fullscreen mode and restoring minimized windows.
|
|
43
|
+
If this is not possible, the Accessibility API is used, which requires the process to be trusted.
|
|
44
|
+
Moving and resizing windows always needs the Accessibility permission.
|
|
45
|
+
*/
|
|
46
|
+
@interface AMWindowUtils : NSObject
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
Whether the XCTest accessibility interface is used (YES by default). If it is turned off, only
|
|
50
|
+
the Accessibility API is used. Intended for tests.
|
|
51
|
+
*/
|
|
52
|
+
@property (class, nonatomic) BOOL usesUnprivilegedRoutes;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
@returns Windows of the given application
|
|
56
|
+
*/
|
|
57
|
+
+ (NSArray<XCUIElement *> *)windowsOfApplication:(XCUIApplication *)application;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
@returns The window flagged as main, then the focused one, then the first one. Nil if there are no windows
|
|
61
|
+
*/
|
|
62
|
+
+ (nullable XCUIElement *)mainWindowOfApplication:(XCUIApplication *)application;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
Describes the window. The result contains:
|
|
66
|
+
title, rect (global coordinates), displayId (the display with the biggest part of the window)
|
|
67
|
+
and the isMain, isFocused, isMinimized, isFullscreen, isMovable, isResizable traits.
|
|
68
|
+
isMovable and isResizable are NSNull if the Accessibility permission is not granted,
|
|
69
|
+
and all the traits are NSNull if the window cannot be read at all.
|
|
70
|
+
|
|
71
|
+
@returns The window info or nil if the element does not exist anymore
|
|
72
|
+
*/
|
|
73
|
+
+ (nullable NSDictionary<NSString *, id> *)infoForWindow:(XCUIElement *)window;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
Changes the state and/or geometry of the window.
|
|
77
|
+
|
|
78
|
+
@param window the window element
|
|
79
|
+
@param application the application that owns the window
|
|
80
|
+
@param arguments any of: state (normal, minimized, maximized, fullscreen), x, y, width, height
|
|
81
|
+
and displayId. Coordinates are global, or relative to the display if displayId is set.
|
|
82
|
+
minimized and fullscreen states cannot be combined with the geometry, and maximized can only be
|
|
83
|
+
combined with displayId. The geometry (including maximized) needs the Accessibility permission.
|
|
84
|
+
@param error AMWindowErrorInvalidArgument, AMWindowErrorFailure or AMWindowErrorNotFound
|
|
85
|
+
(the element does not exist anymore, for example because the window has been minimized)
|
|
86
|
+
@returns The updated window info in the infoForWindow: format or nil in case of failure
|
|
87
|
+
*/
|
|
88
|
+
+ (nullable NSDictionary<NSString *, id> *)adjustWindow:(XCUIElement *)window
|
|
89
|
+
inApplication:(XCUIApplication *)application
|
|
90
|
+
withArguments:(NSDictionary<NSString *, id> *)arguments
|
|
91
|
+
error:(NSError **)error;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
Same as adjustWindow:inApplication:withArguments:error: for the first minimized window of the application.
|
|
95
|
+
Minimized windows cannot be addressed by elements, because they are not a part of the element hierarchy.
|
|
96
|
+
|
|
97
|
+
@returns The updated window info or nil in case of failure. AMWindowErrorNotFound is returned
|
|
98
|
+
if there are no minimized windows
|
|
99
|
+
*/
|
|
100
|
+
+ (nullable NSDictionary<NSString *, id> *)adjustMinimizedWindowOfApplication:(XCUIApplication *)application
|
|
101
|
+
withArguments:(NSDictionary<NSString *, id> *)arguments
|
|
102
|
+
error:(NSError **)error;
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
@returns The number of minimized windows of the application
|
|
106
|
+
*/
|
|
107
|
+
+ (NSUInteger)minimizedWindowsCountOfApplication:(XCUIApplication *)application;
|
|
108
|
+
|
|
109
|
+
@end
|
|
110
|
+
|
|
111
|
+
NS_ASSUME_NONNULL_END
|