这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion WebDriverAgentLib/Categories/XCUIElement+FBClassChain.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ NS_ASSUME_NONNULL_BEGIN
@return an array of descendants matching given class chain
@throws FBUnknownAttributeException if any of predicates in the chain contains unknown attribute(s)
*/
- (NSArray<XCUIElement *> *)fb_descendantsMatchingClassChain:(NSString *)classChainQuery shouldReturnAfterFirstMatch:(BOOL)shouldReturnAfterFirstMatch;
- (NSArray<XCUIElement *> *)fb_descendantsMatchingClassChain:(NSString *)classChainQuery
shouldReturnAfterFirstMatch:(BOOL)shouldReturnAfterFirstMatch;

@end

Expand Down
29 changes: 29 additions & 0 deletions WebDriverAgentLib/Commands/FBSessionCommands.m
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#import "FBSessionCommands.h"

#import "FBCapabilities.h"
#import "FBClassChainQueryParser.h"
#import "FBConfiguration.h"
#import "FBExceptions.h"
#import "FBLogger.h"
Expand Down Expand Up @@ -347,6 +348,7 @@ + (NSArray *)routes
FB_SETTING_INCLUDE_NON_MODAL_ELEMENTS: @([FBConfiguration includeNonModalElements]),
FB_SETTING_ACCEPT_ALERT_BUTTON_SELECTOR: FBConfiguration.acceptAlertButtonSelector,
FB_SETTING_DISMISS_ALERT_BUTTON_SELECTOR: FBConfiguration.dismissAlertButtonSelector,
FB_SETTING_AUTO_CLICK_ALERT_SELECTOR: FBConfiguration.autoClickAlertSelector,
FB_SETTING_DEFAULT_ALERT_ACTION: request.session.defaultAlertAction ?: @"",
FB_SETTING_MAX_TYPING_FREQUENCY: @([FBConfiguration maxTypingFrequency]),
FB_SETTING_RESPECT_SYSTEM_ALERTS: @([FBConfiguration shouldRespectSystemAlerts]),
Expand Down Expand Up @@ -431,6 +433,13 @@ + (NSArray *)routes
if (nil != [settings objectForKey:FB_SETTING_DISMISS_ALERT_BUTTON_SELECTOR]) {
[FBConfiguration setDismissAlertButtonSelector:(NSString *)[settings objectForKey:FB_SETTING_DISMISS_ALERT_BUTTON_SELECTOR]];
}
if (nil != [settings objectForKey:FB_SETTING_AUTO_CLICK_ALERT_SELECTOR]) {
FBCommandStatus *status = [self.class configureAutoClickAlertWithSelector:settings[FB_SETTING_AUTO_CLICK_ALERT_SELECTOR]
forSession:request.session];
if (status.hasError) {
return FBResponseWithStatus(status);
}
}
if (nil != [settings objectForKey:FB_SETTING_WAIT_FOR_IDLE_TIMEOUT]) {
[FBConfiguration setWaitForIdleTimeout:[[settings objectForKey:FB_SETTING_WAIT_FOR_IDLE_TIMEOUT] doubleValue]];
}
Expand Down Expand Up @@ -467,6 +476,26 @@ + (NSArray *)routes

#pragma mark - Helpers

+ (FBCommandStatus *)configureAutoClickAlertWithSelector:(NSString *)selector
forSession:(FBSession *)session
{
if (0 == [selector length]) {
[FBConfiguration setAutoClickAlertSelector:selector];
[session disableAlertsMonitor];
return [FBCommandStatus ok];
}

NSError *error;
FBClassChain *parsedChain = [FBClassChainQueryParser parseQuery:selector error:&error];
if (nil == parsedChain) {
return [FBCommandStatus invalidSelectorErrorWithMessage:error.localizedDescription
traceback:nil];
}
[FBConfiguration setAutoClickAlertSelector:selector];
[session enableAlertsMonitor];
return [FBCommandStatus ok];
}

+ (NSString *)buildTimestamp
{
return [NSString stringWithFormat:@"%@ %@",
Expand Down
2 changes: 1 addition & 1 deletion WebDriverAgentLib/Routing/FBCommandStatus.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, nullable, readonly) NSString* message;
@property (nonatomic, nullable, readonly) NSString* traceback;
@property (nonatomic, readonly) HTTPStatusCode statusCode;

@property (nonatomic, readonly) BOOL hasError;

+ (instancetype)ok;

Expand Down
5 changes: 5 additions & 0 deletions WebDriverAgentLib/Routing/FBCommandStatus.m
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,11 @@ - (instancetype)initWithError:(NSString *)error
return self;
}

- (BOOL)hasError
{
return self.statusCode != kHTTPStatusCodeOK;
}

+ (instancetype)ok
{
return [[FBCommandStatus alloc] initWithValue:nil];
Expand Down
16 changes: 16 additions & 0 deletions WebDriverAgentLib/Routing/FBSession.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,22 @@ extern NSString* const FB_SAFARI_BUNDLE_ID;
*/
- (NSUInteger)applicationStateWithBundleId:(NSString *)bundleIdentifier;

/**
Allows to enable automated session alerts monitoring.
Repeated calls are ignored if alerts monitoring has been already enabled.

@returns YES if the actual alerts monitoring state has been changed
*/
- (BOOL)enableAlertsMonitor;

/**
Allows to disable automated alerts monitoring
Repeated calls are ignored if alerts monitoring has been already disabled.

@returns YES if the actual alerts monitoring state has been changed
*/
- (BOOL)disableAlertsMonitor;

@end

NS_ASSUME_NONNULL_END
49 changes: 42 additions & 7 deletions WebDriverAgentLib/Routing/FBSession.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#import "FBXCTestDaemonsProxy.h"
#import "XCUIApplication+FBQuiescence.h"
#import "XCUIElement.h"
#import "XCUIElement+FBClassChain.h"

/*!
The intial value for the default application property.
Expand Down Expand Up @@ -53,6 +54,22 @@ @implementation FBSession (FBAlertsMonitorDelegate)

- (void)didDetectAlert:(FBAlert *)alert
{
NSString *autoClickAlertSelector = FBConfiguration.autoClickAlertSelector;
if ([autoClickAlertSelector length] > 0) {
@try {
NSArray<XCUIElement*> *matches = [alert.alertElement fb_descendantsMatchingClassChain:autoClickAlertSelector
shouldReturnAfterFirstMatch:YES];
if (matches.count > 0) {
[[matches objectAtIndex:0] tap];
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not a strong opinion but would it be helpful to leave log if the element has over 2? So something like <given selector> matches over two elements. clicking the first one for future investigation

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to keep the current behaviour for now as multiple elements matching might be less performant than single element match, and I prefer performance in this scenario

} @catch (NSException *e) {
[FBLogger logFmt:@"Could not click at the alert element '%@'. Original error: %@",
autoClickAlertSelector, e.description];
}
// This setting has priority over other settings if enabled
return;
}

if (nil == self.defaultAlertAction || 0 == self.defaultAlertAction.length) {
return;
}
Expand Down Expand Up @@ -125,23 +142,41 @@ + (instancetype)initWithApplication:(nullable XCUIApplication *)application
defaultAlertAction:(NSString *)defaultAlertAction
{
FBSession *session = [self.class initWithApplication:application];
session.alertsMonitor = [[FBAlertsMonitor alloc] init];
session.alertsMonitor.delegate = (id<FBAlertsMonitorDelegate>)session;
session.defaultAlertAction = [defaultAlertAction lowercaseString];
[session.alertsMonitor enable];
[session enableAlertsMonitor];
return session;
}

- (BOOL)enableAlertsMonitor
{
if (nil != self.alertsMonitor) {
return NO;
}

self.alertsMonitor = [[FBAlertsMonitor alloc] init];
self.alertsMonitor.delegate = (id<FBAlertsMonitorDelegate>)self;
[self.alertsMonitor enable];
return YES;
}

- (BOOL)disableAlertsMonitor
{
if (nil == self.alertsMonitor) {
return NO;
}

[self.alertsMonitor disable];
self.alertsMonitor = nil;
return YES;
}

- (void)kill
{
if (nil == _activeSession) {
return;
}

if (nil != self.alertsMonitor) {
[self.alertsMonitor disable];
self.alertsMonitor = nil;
}
[self disableAlertsMonitor];

FBScreenRecordingPromise *activeScreenRecording = FBScreenRecordingContainer.sharedInstance.screenRecordingPromise;
if (nil != activeScreenRecording) {
Expand Down
6 changes: 6 additions & 0 deletions WebDriverAgentLib/Utilities/FBConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,12 @@ typedef NS_ENUM(NSInteger, FBConfigurationKeyboardPreference) {
+ (void)setDismissAlertButtonSelector:(NSString *)classChainSelector;
+ (NSString *)dismissAlertButtonSelector;

/**
Sets class chain selector to apply for an automated alert click
*/
+ (void)setAutoClickAlertSelector:(NSString *)classChainSelector;
+ (NSString *)autoClickAlertSelector;

/**
* Whether to use HIDEvent for text clear.
* By default this is enabled and HIDEvent is used for text clear.
Expand Down
12 changes: 12 additions & 0 deletions WebDriverAgentLib/Utilities/FBConfiguration.m
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
static BOOL FBIncludeNonModalElements;
static NSString *FBAcceptAlertButtonSelector;
static NSString *FBDismissAlertButtonSelector;
static NSString *FBAutoClickAlertSelector;
static NSTimeInterval FBWaitForIdleTimeout;
static NSTimeInterval FBAnimationCoolOffTimeout;
static BOOL FBShouldUseCompactResponses;
Expand Down Expand Up @@ -429,6 +430,16 @@ + (NSString *)dismissAlertButtonSelector
return FBDismissAlertButtonSelector;
}

+ (void)setAutoClickAlertSelector:(NSString *)classChainSelector
{
FBAutoClickAlertSelector = classChainSelector;
}

+ (NSString *)autoClickAlertSelector
{
return FBAutoClickAlertSelector;
}

+ (void)setUseClearTextShortcut:(BOOL)enabled
{
FBUseClearTextShortcut = enabled;
Expand Down Expand Up @@ -509,6 +520,7 @@ + (void)resetSessionSettings
FBIncludeNonModalElements = NO;
FBAcceptAlertButtonSelector = @"";
FBDismissAlertButtonSelector = @"";
FBAutoClickAlertSelector = @"";
FBWaitForIdleTimeout = 10.;
FBAnimationCoolOffTimeout = 2.;
// 50 should be enough for the majority of the cases. The performance is acceptable for values up to 100.
Expand Down
1 change: 1 addition & 0 deletions WebDriverAgentLib/Utilities/FBSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ extern NSString* const FB_SETTING_MAX_TYPING_FREQUENCY;
extern NSString* const FB_SETTING_RESPECT_SYSTEM_ALERTS;
extern NSString* const FB_SETTING_USE_CLEAR_TEXT_SHORTCUT;
extern NSString* const FB_SETTING_LIMIT_XPATH_CONTEXT_SCOPE;
extern NSString* const FB_SETTING_AUTO_CLICK_ALERT_SELECTOR;


NS_ASSUME_NONNULL_END
1 change: 1 addition & 0 deletions WebDriverAgentLib/Utilities/FBSettings.m
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,4 @@
NSString* const FB_SETTING_RESPECT_SYSTEM_ALERTS = @"respectSystemAlerts";
NSString* const FB_SETTING_USE_CLEAR_TEXT_SHORTCUT = @"useClearTextShortcut";
NSString* const FB_SETTING_LIMIT_XPATH_CONTEXT_SCOPE = @"limitXPathContextScope";
NSString* const FB_SETTING_AUTO_CLICK_ALERT_SELECTOR = @"autoClickAlertSelector";
Loading