blob: 7e6879afff6c42aa26c5b5e96a9182e69b71f342 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/test/earl_grey/chrome_matchers_app_interface.h"
#include "base/mac/foundation_util.h"
#include "base/strings/sys_string_conversions.h"
#include "components/strings/grit/components_strings.h"
#import "ios/chrome/browser/autofill/form_suggestion_constants.h"
#import "ios/chrome/browser/ui/authentication/cells/signin_promo_view_constants.h"
#import "ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_constants.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/address_view_controller.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_coordinator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/card_view_controller.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_accessory_view_controller.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_address_mediator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_card_mediator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_cell.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/manual_fill_password_mediator.h"
#import "ios/chrome/browser/ui/autofill/manual_fill/password_view_controller.h"
#import "ios/chrome/browser/ui/autofill/save_card_infobar_controller.h"
#import "ios/chrome/browser/ui/bookmarks/bookmark_ui_constants.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_constants.h"
#import "ios/chrome/browser/ui/content_suggestions/content_suggestions_view_controller.h"
#import "ios/chrome/browser/ui/content_suggestions/ntp_home_constant.h"
#import "ios/chrome/browser/ui/history/history_ui_constants.h"
#import "ios/chrome/browser/ui/location_bar/location_bar_constants.h"
#import "ios/chrome/browser/ui/location_bar/location_bar_steady_view.h"
#import "ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_views_utils.h"
#import "ios/chrome/browser/ui/omnibox/omnibox_text_field_ios.h"
#import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
#import "ios/chrome/browser/ui/recent_tabs/recent_tabs_constants.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_add_credit_card_view_controller.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_constants.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_credit_card_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/autofill/autofill_profile_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/cells/clear_browsing_data_constants.h"
#import "ios/chrome/browser/ui/settings/cells/settings_switch_cell.h"
#import "ios/chrome/browser/ui/settings/cells/settings_switch_item.h"
#import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_ui_constants.h"
#import "ios/chrome/browser/ui/settings/credit_card_scanner/credit_card_scanner_view_controller.h"
#import "ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller_constants.h"
#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_constants.h"
#import "ios/chrome/browser/ui/settings/import_data_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/password/passwords_table_view_constants.h"
#import "ios/chrome/browser/ui/settings/privacy/privacy_table_view_controller.h"
#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
#import "ios/chrome/browser/ui/settings/settings_root_table_constants.h"
#import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h"
#import "ios/chrome/browser/ui/tab_grid/grid/grid_constants.h"
#import "ios/chrome/browser/ui/tab_grid/tab_grid_constants.h"
#import "ios/chrome/browser/ui/table_view/cells/table_view_url_item.h"
#import "ios/chrome/browser/ui/toolbar/primary_toolbar_view.h"
#import "ios/chrome/browser/ui/toolbar/public/toolbar_constants.h"
#import "ios/chrome/browser/ui/util/ui_util.h"
#import "ios/chrome/browser/ui/util/uikit_ui_util.h"
#include "ios/chrome/grit/ios_strings.h"
#import "ios/chrome/test/app/tab_test_util.h"
#import "ios/testing/earl_grey/earl_grey_app.h"
#import "ios/web/public/test/earl_grey/web_view_matchers.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/test/ios/ui_image_test_utils.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {
// Identifer for cell at given |index| in the tab grid.
NSString* IdentifierForCellAtIndex(unsigned int index) {
return [NSString stringWithFormat:@"%@%u", kGridCellIdentifierPrefix, index];
}
id<GREYMatcher> SettingsSwitchIsToggledOn(BOOL is_toggled_on) {
GREYMatchesBlock matches = ^BOOL(id element) {
SettingsSwitchCell* switch_cell =
base::mac::ObjCCastStrict<SettingsSwitchCell>(element);
UISwitch* switch_view = switch_cell.switchView;
return (switch_view.on && is_toggled_on) ||
(!switch_view.on && !is_toggled_on);
};
GREYDescribeToBlock describe = ^void(id<GREYDescription> description) {
NSString* name =
[NSString stringWithFormat:@"settingsSwitchToggledState(%@)",
is_toggled_on ? @"ON" : @"OFF"];
[description appendText:name];
};
return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe];
}
id<GREYMatcher> SettingsSwitchIsEnabled(BOOL is_enabled) {
GREYMatchesBlock matches = ^BOOL(id element) {
SettingsSwitchCell* switch_cell =
base::mac::ObjCCastStrict<SettingsSwitchCell>(element);
UISwitch* switch_view = switch_cell.switchView;
return (switch_view.enabled && is_enabled) ||
(!switch_view.enabled && !is_enabled);
};
GREYDescribeToBlock describe = ^void(id<GREYDescription> description) {
NSString* name =
[NSString stringWithFormat:@"settingsSwitchEnabledState(%@)",
is_enabled ? @"YES" : @"NO"];
[description appendText:name];
};
return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe];
}
// Returns the subview of |parentView| corresponding to the
// ContentSuggestionsViewController. Returns nil if it is not in its subviews.
UIView* SubviewWithAccessibilityIdentifier(NSString* accessibility_id,
UIView* parent_view) {
if (parent_view.accessibilityIdentifier == accessibility_id) {
return parent_view;
}
for (UIView* view in parent_view.subviews) {
UIView* result_view =
SubviewWithAccessibilityIdentifier(accessibility_id, view);
if (result_view)
return result_view;
}
return nil;
}
} // namespace
@implementation ChromeMatchersAppInterface
+ (id<GREYMatcher>)buttonWithAccessibilityLabel:(NSString*)label {
return grey_allOf(grey_accessibilityLabel(label),
grey_accessibilityTrait(UIAccessibilityTraitButton), nil);
}
+ (id<GREYMatcher>)buttonWithAccessibilityLabelID:(int)messageID {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabel:l10n_util::GetNSStringWithFixup(messageID)];
}
+ (id<GREYMatcher>)imageViewWithImageNamed:(NSString*)imageName {
UIImage* expectedImage = [UIImage imageNamed:imageName];
GREYMatchesBlock matches = ^BOOL(UIImageView* imageView) {
return ui::test::uiimage_utils::UIImagesAreEqual(expectedImage,
imageView.image);
};
NSString* descriptionString =
[NSString stringWithFormat:@"Images matching image named %@", imageName];
GREYDescribeToBlock describe = ^(id<GREYDescription> description) {
[description appendText:descriptionString];
};
id<GREYMatcher> imageMatcher =
[[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe];
return imageMatcher;
}
+ (id<GREYMatcher>)imageViewWithImage:(int)imageID {
UIImage* expectedImage = NativeImage(imageID);
GREYMatchesBlock matches = ^BOOL(UIImageView* imageView) {
return ui::test::uiimage_utils::UIImagesAreEqual(expectedImage,
imageView.image);
};
NSString* descriptionString =
[NSString stringWithFormat:@"Images matching %i", imageID];
GREYDescribeToBlock describe = ^(id<GREYDescription> description) {
[description appendText:descriptionString];
};
id<GREYMatcher> imageMatcher =
[[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe];
return imageMatcher;
}
+ (id<GREYMatcher>)buttonWithImage:(int)imageID {
UIImage* expectedImage = NativeImage(imageID);
GREYMatchesBlock matches = ^BOOL(UIButton* button) {
return ui::test::uiimage_utils::UIImagesAreEqual(expectedImage,
[button currentImage]);
};
NSString* descriptionString =
[NSString stringWithFormat:@"Images matching %i", imageID];
GREYDescribeToBlock describe = ^(id<GREYDescription> description) {
[description appendText:descriptionString];
};
id<GREYMatcher> imageMatcher =
[[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe];
return grey_allOf(grey_accessibilityTrait(UIAccessibilityTraitButton),
imageMatcher, nil);
}
+ (id<GREYMatcher>)staticTextWithAccessibilityLabelID:(int)messageID {
return [ChromeMatchersAppInterface
staticTextWithAccessibilityLabel:(l10n_util::GetNSStringWithFixup(
messageID))];
}
+ (id<GREYMatcher>)staticTextWithAccessibilityLabel:(NSString*)label {
return grey_allOf(grey_accessibilityLabel(label),
grey_accessibilityTrait(UIAccessibilityTraitStaticText),
nil);
}
+ (id<GREYMatcher>)headerWithAccessibilityLabelID:(int)messageID {
return [ChromeMatchersAppInterface
headerWithAccessibilityLabel:(l10n_util::GetNSStringWithFixup(
messageID))];
}
+ (id<GREYMatcher>)headerWithAccessibilityLabel:(NSString*)label {
return grey_allOf(grey_accessibilityLabel(label),
grey_accessibilityTrait(UIAccessibilityTraitHeader), nil);
}
+ (id<GREYMatcher>)navigationBarTitleWithAccessibilityLabelID:(int)labelID {
return grey_allOf(
grey_accessibilityID(l10n_util::GetNSStringWithFixup(labelID)),
grey_kindOfClass([UINavigationBar class]), nil);
}
+ (id<GREYMatcher>)textFieldForCellWithLabelID:(int)messageID {
return grey_allOf(grey_accessibilityID([l10n_util::GetNSStringWithFixup(
messageID) stringByAppendingString:@"_textField"]),
grey_kindOfClass([UITextField class]), nil);
}
+ (id<GREYMatcher>)iconViewForCellWithLabelID:(int)messageID
iconType:(NSString*)iconType {
return grey_allOf(grey_accessibilityID([l10n_util::GetNSStringWithFixup(
messageID) stringByAppendingString:iconType]),
grey_kindOfClass([UIImageView class]), nil);
}
+ (id<GREYMatcher>)primaryToolbar {
return grey_kindOfClass([PrimaryToolbarView class]);
}
+ (id<GREYMatcher>)cancelButton {
return
[ChromeMatchersAppInterface buttonWithAccessibilityLabelID:(IDS_CANCEL)];
}
+ (id<GREYMatcher>)navigationBarCancelButton {
return grey_allOf(
grey_ancestor(grey_kindOfClass([UINavigationBar class])),
[self cancelButton],
grey_not(grey_accessibilityTrait(UIAccessibilityTraitNotEnabled)), nil);
}
+ (id<GREYMatcher>)closeButton {
return grey_allOf(
[ChromeMatchersAppInterface buttonWithAccessibilityLabelID:(IDS_CLOSE)],
grey_not(grey_accessibilityTrait(UIAccessibilityTraitNotEnabled)), nil);
}
+ (id<GREYMatcher>)forwardButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_ACCNAME_FORWARD)];
}
+ (id<GREYMatcher>)backButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_ACCNAME_BACK)];
}
+ (id<GREYMatcher>)reloadButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_ACCNAME_RELOAD)];
}
+ (id<GREYMatcher>)stopButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_ACCNAME_STOP)];
}
+ (id<GREYMatcher>)omnibox {
return grey_allOf(grey_kindOfClass([OmniboxTextFieldIOS class]),
grey_userInteractionEnabled(), nil);
}
+ (id<GREYMatcher>)defocusedLocationView {
return grey_kindOfClass([LocationBarSteadyView class]);
}
+ (id<GREYMatcher>)pageSecurityInfoButton {
return grey_accessibilityLabel(@"Page Security Info");
}
+ (id<GREYMatcher>)pageSecurityInfoIndicator {
return grey_accessibilityLabel(@"Page Security Info");
}
+ (id<GREYMatcher>)omniboxText:(NSString*)text {
GREYElementMatcherBlock* matcher = [GREYElementMatcherBlock
matcherWithMatchesBlock:^BOOL(id element) {
OmniboxTextFieldIOS* omnibox =
base::mac::ObjCCast<OmniboxTextFieldIOS>(element);
return [omnibox.text isEqualToString:text];
}
descriptionBlock:^void(id<GREYDescription> description) {
[description
appendText:[NSString stringWithFormat:@"Omnibox contains text '%@'",
text]];
}];
return matcher;
}
+ (id<GREYMatcher>)omniboxContainingText:(NSString*)text {
GREYElementMatcherBlock* matcher = [GREYElementMatcherBlock
matcherWithMatchesBlock:^BOOL(id element) {
OmniboxTextFieldIOS* omnibox =
base::mac::ObjCCast<OmniboxTextFieldIOS>(element);
return [omnibox.text containsString:text];
}
descriptionBlock:^void(id<GREYDescription> description) {
[description
appendText:[NSString stringWithFormat:@"Omnibox contains text '%@'",
text]];
}];
return matcher;
}
+ (id<GREYMatcher>)locationViewContainingText:(NSString*)text {
GREYElementMatcherBlock* matcher = [GREYElementMatcherBlock
matcherWithMatchesBlock:^BOOL(LocationBarSteadyView* element) {
return [element.locationLabel.text containsString:text];
}
descriptionBlock:^void(id<GREYDescription> description) {
[description
appendText:[NSString
stringWithFormat:
@"LocationBarSteadyView contains text '%@'",
text]];
}];
return matcher;
}
+ (id<GREYMatcher>)toolsMenuButton {
return grey_allOf(grey_accessibilityID(kToolbarToolsMenuButtonIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)shareButton {
return grey_allOf(
[ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_TOOLS_MENU_SHARE)],
grey_not([self tabShareButton]), grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabShareButton {
return grey_allOf(
grey_anyOf(grey_accessibilityID(kToolbarShareButtonIdentifier),
grey_accessibilityID(kOmniboxShareButtonIdentifier), nil),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)showTabsButton {
return grey_allOf(grey_accessibilityID(kToolbarStackButtonIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)settingsSwitchCell:(NSString*)accessibilityIdentifier
isToggledOn:(BOOL)isToggledOn {
return [ChromeMatchersAppInterface settingsSwitchCell:accessibilityIdentifier
isToggledOn:isToggledOn
isEnabled:YES];
}
+ (id<GREYMatcher>)settingsSwitchCell:(NSString*)accessibilityIdentifier
isToggledOn:(BOOL)isToggledOn
isEnabled:(BOOL)isEnabled {
return grey_allOf(grey_accessibilityID(accessibilityIdentifier),
SettingsSwitchIsToggledOn(isToggledOn),
SettingsSwitchIsEnabled(isEnabled),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)syncSwitchCell:(NSString*)accessibilityLabel
isToggledOn:(BOOL)isToggledOn {
return grey_allOf(
grey_accessibilityLabel(accessibilityLabel),
grey_accessibilityValue(
isToggledOn ? l10n_util::GetNSString(IDS_IOS_SETTING_ON)
: l10n_util::GetNSString(IDS_IOS_SETTING_OFF)),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)openLinkInNewTabButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWTAB)];
}
+ (id<GREYMatcher>)openLinkInIncognitoButtonWithUseNewString:
(BOOL)useNewString {
int stringId = useNewString ? IDS_IOS_OPEN_IN_INCOGNITO_ACTION_TITLE
: IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB;
return [ChromeMatchersAppInterface buttonWithAccessibilityLabelID:(stringId)];
}
+ (id<GREYMatcher>)openLinkInNewWindowButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_CONTENT_CONTEXT_OPENINNEWWINDOW)];
}
+ (id<GREYMatcher>)navigationBarDoneButton {
return grey_allOf(
[ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_NAVIGATION_BAR_DONE_BUTTON)],
grey_userInteractionEnabled(), grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)bookmarksNavigationBarDoneButton {
return grey_accessibilityID(kBookmarkHomeNavigationBarDoneButtonIdentifier);
}
+ (id<GREYMatcher>)bookmarksNavigationBarBackButton {
UINavigationBar* navBar = base::mac::ObjCCastStrict<UINavigationBar>(
SubviewWithAccessibilityIdentifier(
kBookmarkNavigationBarIdentifier,
[[UIApplication sharedApplication] keyWindow]));
return grey_allOf(grey_buttonTitle(navBar.backItem.title),
grey_ancestor(grey_kindOfClass([UINavigationBar class])),
nil);
}
+ (id<GREYMatcher>)addAccountButton {
return grey_accessibilityID(kSettingsAccountsTableViewAddAccountCellId);
}
+ (id<GREYMatcher>)signOutAccountsButton {
return grey_accessibilityID(kSettingsAccountsTableViewSignoutCellId);
}
+ (id<GREYMatcher>)clearBrowsingDataCell {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_CLEAR_BROWSING_DATA_TITLE)];
}
+ (id<GREYMatcher>)clearBrowsingDataButton {
return grey_accessibilityID(kClearBrowsingDataButtonIdentifier);
}
+ (id<GREYMatcher>)clearBrowsingDataView {
return grey_accessibilityID(kClearBrowsingDataViewAccessibilityIdentifier);
}
+ (id<GREYMatcher>)confirmClearBrowsingDataButton {
return grey_allOf(
grey_accessibilityLabel(l10n_util::GetNSString(IDS_IOS_CLEAR_BUTTON)),
grey_accessibilityTrait(UIAccessibilityTraitButton),
grey_not(grey_accessibilityID(kClearBrowsingDataButtonIdentifier)),
grey_userInteractionEnabled(), nil);
}
+ (id<GREYMatcher>)settingsMenuButton {
return grey_accessibilityID(kToolsMenuSettingsId);
}
+ (id<GREYMatcher>)settingsDoneButton {
return grey_accessibilityID(kSettingsDoneButtonId);
}
+ (id<GREYMatcher>)syncSettingsConfirmButton {
return grey_accessibilityID(kSyncSettingsConfirmButtonId);
}
+ (id<GREYMatcher>)addressesAndMoreButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_AUTOFILL_ADDRESSES_SETTINGS_TITLE)];
}
+ (id<GREYMatcher>)paymentMethodsButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_AUTOFILL_PAYMENT_METHODS)];
}
+ (id<GREYMatcher>)languagesButton {
return grey_accessibilityID(kSettingsLanguagesCellId);
}
+ (id<GREYMatcher>)addCreditCardView {
return grey_accessibilityID(kAddCreditCardViewID);
}
+ (id<GREYMatcher>)autofillCreditCardTableView {
return grey_accessibilityID(kAutofillCreditCardTableViewId);
}
+ (id<GREYMatcher>)addPaymentMethodButton {
return grey_accessibilityID(kSettingsAddPaymentMethodButtonId);
}
+ (id<GREYMatcher>)addCreditCardButton {
return grey_accessibilityID(kSettingsAddCreditCardButtonID);
}
+ (id<GREYMatcher>)addCreditCardCancelButton {
return grey_accessibilityID(kSettingsAddCreditCardCancelButtonID);
}
+ (id<GREYMatcher>)creditCardScannerView {
return grey_accessibilityID(kCreditCardScannerViewID);
}
+ (id<GREYMatcher>)toolsMenuView {
return grey_accessibilityID(kPopupMenuToolsMenuTableViewId);
}
+ (id<GREYMatcher>)OKButton {
return [ChromeMatchersAppInterface buttonWithAccessibilityLabelID:(IDS_OK)];
}
+ (id<GREYMatcher>)primarySignInButton {
return grey_allOf(grey_accessibilityID(kSigninPromoPrimaryButtonId),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)secondarySignInButton {
return grey_allOf(grey_accessibilityID(kSigninPromoSecondaryButtonId),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)settingsAccountButton {
return grey_accessibilityID(kSettingsAccountCellId);
}
+ (id<GREYMatcher>)settingsAccountsCollectionView {
return grey_accessibilityID(kSettingsAccountsTableViewId);
}
+ (id<GREYMatcher>)settingsImportDataImportButton {
return grey_accessibilityID(kImportDataImportCellId);
}
+ (id<GREYMatcher>)settingsImportDataKeepSeparateButton {
return grey_accessibilityID(kImportDataKeepSeparateCellId);
}
+ (id<GREYMatcher>)settingsImportDataContinueButton {
return grey_accessibilityID(kImportDataContinueButtonId);
}
+ (id<GREYMatcher>)settingsPrivacyTableView {
return grey_accessibilityID(kPrivacyTableViewId);
}
+ (id<GREYMatcher>)accountsSyncButton {
return grey_allOf(grey_accessibilityID(kSettingsAccountsTableViewSyncCellId),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)contentSettingsButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_CONTENT_SETTINGS_TITLE)];
}
+ (id<GREYMatcher>)googleServicesSettingsButton {
return grey_allOf(
grey_kindOfClass([UITableViewCell class]), grey_sufficientlyVisible(),
grey_accessibilityID(kSettingsGoogleSyncAndServicesCellId), nil);
}
+ (id<GREYMatcher>)googleServicesSettingsView {
return grey_accessibilityID(kGoogleServicesSettingsViewIdentifier);
}
+ (id<GREYMatcher>)settingsMenuBackButton {
UINavigationBar* navBar = base::mac::ObjCCastStrict<UINavigationBar>(
SubviewWithAccessibilityIdentifier(
@"SettingNavigationBar",
[[UIApplication sharedApplication] keyWindow]));
return grey_allOf(grey_anyOf(grey_buttonTitle(navBar.backItem.title),
grey_buttonTitle(@"Back"), nil),
grey_ancestor(grey_kindOfClass([UINavigationBar class])),
nil);
}
+ (id<GREYMatcher>)settingsMenuPrivacyButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:
(IDS_OPTIONS_ADVANCED_SECTION_TITLE_PRIVACY)];
}
+ (id<GREYMatcher>)settingsMenuPasswordsButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_PASSWORDS)];
}
// TODO(crbug.com/1021752): Remove this stub.
+ (id<GREYMatcher>)paymentRequestView {
return nil;
}
// TODO(crbug.com/1021752): Remove this stub.
+ (id<GREYMatcher>)paymentRequestErrorView {
return nil;
}
+ (id<GREYMatcher>)voiceSearchButton {
return grey_allOf(grey_accessibilityID(kSettingsVoiceSearchCellId),
grey_accessibilityTrait(UIAccessibilityTraitButton), nil);
}
+ (id<GREYMatcher>)voiceSearchInputAccessoryButton {
return grey_accessibilityID(kVoiceSearchInputAccessoryViewID);
}
+ (id<GREYMatcher>)settingsCollectionView {
return grey_accessibilityID(kSettingsTableViewId);
}
+ (id<GREYMatcher>)clearBrowsingHistoryButton {
// Needs to use grey_sufficientlyVisible() to make the difference between a
// cell used by the tableview and a invisible recycled cell.
return grey_allOf(
grey_accessibilityID(kClearBrowsingHistoryCellAccessibilityIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)clearCookiesButton {
// Needs to use grey_sufficientlyVisible() to make the difference between a
// cell used by the tableview and a invisible recycled cell.
return grey_allOf(
grey_accessibilityID(kClearCookiesCellAccessibilityIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)clearCacheButton {
// Needs to use grey_sufficientlyVisible() to make the difference between a
// cell used by the tableview and a invisible recycled cell.
return grey_allOf(
grey_accessibilityID(kClearCacheCellAccessibilityIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)clearSavedPasswordsButton {
// Needs to use grey_sufficientlyVisible() to make the difference between a
// cell used by the tableview and a invisible recycled cell.
return grey_allOf(
grey_accessibilityID(kClearSavedPasswordsCellAccessibilityIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)clearAutofillButton {
// Needs to use grey_sufficientlyVisible() to make the difference between a
// cell used by the tableview and a invisible recycled cell.
return grey_allOf(
grey_accessibilityID(kClearAutofillCellAccessibilityIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)contentSuggestionCollectionView {
return grey_accessibilityID(kContentSuggestionsCollectionIdentifier);
}
// TODO(crbug.com/1021752): Remove this stub.
+ (id<GREYMatcher>)warningMessageView {
return nil;
}
// TODO(crbug.com/1021752): Remove this stub.
+ (id<GREYMatcher>)paymentRequestPickerRow {
return nil;
}
// TODO(crbug.com/1021752): Remove this stub.
+ (id<GREYMatcher>)paymentRequestPickerSearchBar {
return nil;
}
+ (id<GREYMatcher>)readingListMenuButton {
return grey_accessibilityID(kToolsMenuReadingListId);
}
+ (id<GREYMatcher>)bookmarksMenuButton {
return grey_accessibilityID(kToolsMenuBookmarksId);
}
+ (id<GREYMatcher>)recentTabsMenuButton {
return grey_accessibilityID(kToolsMenuOtherDevicesId);
}
+ (id<GREYMatcher>)systemSelectionCallout {
return grey_kindOfClass(NSClassFromString(@"UICalloutBarButton"));
}
+ (id<GREYMatcher>)systemSelectionCalloutCopyButton {
return grey_allOf(grey_accessibilityLabel(@"Copy"),
[self systemSelectionCallout], nil);
}
+ (id<GREYMatcher>)copyLinkButtonWithUseNewString:(BOOL)useNewString {
int stringId = useNewString ? IDS_IOS_COPY_LINK_ACTION_TITLE
: IDS_IOS_CONTENT_CONTEXT_COPY;
return [ChromeMatchersAppInterface buttonWithAccessibilityLabelID:stringId];
}
+ (id<GREYMatcher>)editButtonWithUseNewString:(BOOL)useNewString {
int stringId = useNewString ? IDS_IOS_EDIT_ACTION_TITLE
: IDS_IOS_BOOKMARK_CONTEXT_MENU_EDIT;
return [ChromeMatchersAppInterface buttonWithAccessibilityLabelID:stringId];
}
+ (id<GREYMatcher>)moveButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:IDS_IOS_BOOKMARK_CONTEXT_MENU_MOVE];
}
+ (id<GREYMatcher>)readingListMarkAsReadButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:IDS_IOS_READING_LIST_MARK_AS_READ_ACTION];
}
+ (id<GREYMatcher>)readingListMarkAsUnreadButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:
IDS_IOS_READING_LIST_MARK_AS_UNREAD_ACTION];
}
+ (id<GREYMatcher>)deleteButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:IDS_IOS_DELETE_ACTION_TITLE];
}
+ (id<GREYMatcher>)contextMenuCopyButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:(IDS_IOS_CONTENT_CONTEXT_COPY)];
}
+ (id<GREYMatcher>)NTPOmnibox {
return grey_allOf(
grey_accessibilityLabel(l10n_util::GetNSString(IDS_OMNIBOX_EMPTY_HINT)),
grey_minimumVisiblePercent(0.2), nil);
}
+ (id<GREYMatcher>)fakeOmnibox {
return grey_accessibilityID(ntp_home::FakeOmniboxAccessibilityID());
}
+ (id<GREYMatcher>)webViewMatcher {
return web::WebViewInWebState(chrome_test_util::GetCurrentWebState());
}
+ (id<GREYMatcher>)webStateScrollViewMatcher {
return web::WebViewScrollView(chrome_test_util::GetCurrentWebState());
}
+ (id<GREYMatcher>)historyClearBrowsingDataButton {
return grey_accessibilityID(kHistoryToolbarClearBrowsingButtonIdentifier);
}
+ (id<GREYMatcher>)openInButton {
return [ChromeMatchersAppInterface
buttonWithAccessibilityLabelID:IDS_IOS_OPEN_IN];
}
+ (id<GREYMatcher>)tabGridCellAtIndex:(unsigned int)index {
return grey_allOf(grey_accessibilityID(IdentifierForCellAtIndex(index)),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridDoneButton {
return grey_allOf(grey_accessibilityID(kTabGridDoneButtonIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridCloseAllButton {
return grey_allOf(grey_accessibilityID(kTabGridCloseAllButtonIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridUndoCloseAllButton {
return grey_allOf(grey_accessibilityID(kTabGridUndoCloseAllButtonIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridSelectShowHistoryCell {
return grey_allOf(grey_accessibilityID(
kRecentTabsShowFullHistoryCellAccessibilityIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridRegularTabsEmptyStateView {
return grey_allOf(
grey_accessibilityID(kTabGridRegularTabsEmptyStateIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridNewTabButton {
return grey_allOf(
[self buttonWithAccessibilityLabelID:IDS_IOS_TAB_GRID_CREATE_NEW_TAB],
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridNewIncognitoTabButton {
return grey_allOf([self buttonWithAccessibilityLabelID:
IDS_IOS_TAB_GRID_CREATE_NEW_INCOGNITO_TAB],
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)tabGridOpenTabsPanelButton {
return grey_accessibilityID(kTabGridRegularTabsPageButtonIdentifier);
}
+ (id<GREYMatcher>)tabGridIncognitoTabsPanelButton {
return grey_accessibilityID(kTabGridIncognitoTabsPageButtonIdentifier);
}
+ (id<GREYMatcher>)tabGridOtherDevicesPanelButton {
return grey_accessibilityID(kTabGridRemoteTabsPageButtonIdentifier);
}
+ (id<GREYMatcher>)tabGridCloseButtonForCellAtIndex:(unsigned int)index {
return grey_allOf(
grey_ancestor(grey_accessibilityID(IdentifierForCellAtIndex(index))),
grey_accessibilityID(kGridCellCloseButtonIdentifier),
grey_sufficientlyVisible(), nil);
}
+ (id<GREYMatcher>)settingsPasswordMatcher {
return grey_accessibilityID(kPasswordsTableViewId);
}
+ (id<GREYMatcher>)settingsPasswordSearchMatcher {
return grey_accessibilityID(kPasswordsSearchBarId);
}
+ (id<GREYMatcher>)settingsProfileMatcher {
return grey_accessibilityID(kAutofillProfileTableViewID);
}
+ (id<GREYMatcher>)settingsCreditCardMatcher {
return grey_accessibilityID(kAutofillCreditCardTableViewId);
}
+ (id<GREYMatcher>)autofillSuggestionViewMatcher {
return grey_accessibilityID(kFormSuggestionLabelAccessibilityIdentifier);
}
+ (id<GREYMatcher>)settingsBottomToolbarDeleteButton {
return grey_accessibilityID(kSettingsToolbarDeleteButtonId);
}
+ (id<GREYMatcher>)settingsSearchEngineButton {
return grey_accessibilityID(kSettingsSearchEngineCellId);
}
+ (id<GREYMatcher>)contentViewSmallerThanScrollView {
GREYMatchesBlock matches = ^BOOL(UIView* view) {
UIScrollView* scrollView = base::mac::ObjCCast<UIScrollView>(view);
return scrollView &&
scrollView.contentSize.height < scrollView.bounds.size.height;
};
GREYDescribeToBlock describe = ^void(id<GREYDescription> description) {
[description
appendText:@"Not a scroll view or the scroll view content is bigger "
@"than the scroll view bounds"];
};
return [[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe];
}
+ (id<GREYMatcher>)autofillSaveCardLocallyInfobar {
return grey_accessibilityID(kSaveCardInfobarViewLocalAccessibilityID);
}
+ (id<GREYMatcher>)autofillUploadCardInfobar {
return grey_accessibilityID(kSaveCardInfobarViewUploadAccessibilityID);
}
+ (id<GREYMatcher>)historyEntryForURL:(NSString*)URL title:(NSString*)title {
GREYMatchesBlock matches = ^BOOL(TableViewURLCell* cell) {
return [cell.titleLabel.text isEqual:title] &&
[cell.URLLabel.text isEqual:URL];
};
GREYDescribeToBlock describe = ^(id<GREYDescription> description) {
[description appendText:@"view containing URL text: "];
[description appendText:URL];
[description appendText:@" title text: "];
[description appendText:title];
};
return grey_allOf(
grey_kindOfClass([TableViewURLCell class]),
[[GREYElementMatcherBlock alloc] initWithMatchesBlock:matches
descriptionBlock:describe],
grey_sufficientlyVisible(), nil);
}
#pragma mark - Manual Fallback
+ (id<GREYMatcher>)manualFallbackFormSuggestionViewMatcher {
return grey_accessibilityID(kFormSuggestionsViewAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackPasswordIconMatcher {
return grey_accessibilityID(
manual_fill::AccessoryPasswordAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackKeyboardIconMatcher {
return grey_accessibilityID(
manual_fill::AccessoryKeyboardAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackPasswordTableViewMatcher {
return grey_accessibilityID(
manual_fill::kPasswordTableViewAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackPasswordSearchBarMatcher {
return grey_accessibilityID(
manual_fill::kPasswordSearchBarAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackManagePasswordsMatcher {
return grey_accessibilityID(
manual_fill::ManagePasswordsAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackOtherPasswordsMatcher {
return grey_accessibilityID(
manual_fill::OtherPasswordsAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackOtherPasswordsDismissMatcher {
return grey_accessibilityID(
manual_fill::kPasswordDoneButtonAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackPasswordButtonMatcher {
return grey_buttonTitle(kMaskedPasswordTitle);
}
+ (id<GREYMatcher>)manualFallbackPasswordTableViewWindowMatcher {
id<GREYMatcher> classMatcher = grey_kindOfClass([UIWindow class]);
id<GREYMatcher> parentMatcher =
grey_descendant([self manualFallbackPasswordTableViewMatcher]);
return grey_allOf(classMatcher, parentMatcher, nil);
}
+ (id<GREYMatcher>)manualFallbackProfilesIconMatcher {
return grey_accessibilityID(
manual_fill::AccessoryAddressAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackProfilesTableViewMatcher {
return grey_accessibilityID(
manual_fill::AddressTableViewAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackManageProfilesMatcher {
return grey_accessibilityID(
manual_fill::ManageAddressAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackProfileTableViewWindowMatcher {
id<GREYMatcher> classMatcher = grey_kindOfClass([UIWindow class]);
id<GREYMatcher> parentMatcher =
grey_descendant([self manualFallbackProfilesTableViewMatcher]);
return grey_allOf(classMatcher, parentMatcher, nil);
}
+ (id<GREYMatcher>)manualFallbackCreditCardIconMatcher {
return grey_accessibilityID(
manual_fill::AccessoryCreditCardAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackCreditCardTableViewMatcher {
return grey_accessibilityID(
manual_fill::CardTableViewAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackManageCreditCardsMatcher {
return grey_accessibilityID(manual_fill::ManageCardsAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackAddCreditCardsMatcher {
return grey_accessibilityID(
manual_fill::kAddCreditCardsAccessibilityIdentifier);
}
+ (id<GREYMatcher>)manualFallbackCreditCardTableViewWindowMatcher {
id<GREYMatcher> classMatcher = grey_kindOfClass([UIWindow class]);
id<GREYMatcher> parentMatcher =
grey_descendant([self manualFallbackCreditCardTableViewMatcher]);
return grey_allOf(classMatcher, parentMatcher, nil);
}
+ (id<GREYMatcher>)activityViewHeaderWithTitle:(NSString*)pageTitle {
return grey_allOf(grey_accessibilityLabel(pageTitle),
grey_ancestor(grey_allOf(
grey_accessibilityTrait(UIAccessibilityTraitHeader),
grey_kindOfClassName(@"LPLinkView"), nil)),
nil);
}
@end