使用XCUIElementQuery查询未找到tableHeaderView中的按钮

时间:2016-06-24 08:31:20

标签: ios xcode-ui-testing uiaccessibility

我想使用Xcode UI Test来帮助我自动测试我的应用。

我的视图层次结构如:UITableView-> TableHeaderView->我的自定义视图 - >设置按钮。

我想用accessibilityIdentifier查询我的按钮,我在我的viewController中设置它,并使用模拟器的辅助功能检查器检查它,并使用我的真实设备和语音检查按钮是可访问性。

但是使用我的代码,它无法建立:

app.tables.buttons["settingBtn"].tap()

为什么我的设置按钮是可访问性但是Xcode无法记录它并且我自己的代码找不到设置按钮?

有人可以给我一些使用UIElementQuery以正确方式访问我的按钮的提示吗?

---编辑---

在自定义视图中:

@implementation HeaderView

- (void)awakeFromNib {
    [super awakeFromNib];

    [self initAccessibility];
}

- (BOOL)isAccessibilityElement {
    return NO;
}

- (NSArray *)accessibilityElements {
    return @[self.settingButton];
}

- (NSInteger)accessibilityElementCount {
    return [[self accessibilityElements] count];
}

- (NSInteger)indexOfAccessibilityElement:(id)element {
    return [[self accessibilityElements] indexOfObject:element];
}

- (void)initAccessibility {
    self.settingButton.isAccessibilityElement = YES;
    self.settingButton.accessibilityIdentifier = @"settingBtn";
    self.settingButton.accessibilityLabel = @"settingBtn";
}

- (IBAction)clickSettingButton:(id)sender {
    if ([self.delegate respondsToSelector:@selector(clickSettingButton)]) {
        [self.delegate clickSettingButton];
    }
}

@end
viewController中的

- (void)initHeaderView {
    self.headerView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([HeaderView class]) owner:self options:nil] firstObject];
    self.headerView.delegate = self;
    [self.headerView.backgroundImageView sd_setImageWithURL:[NSURL URLWithString:kURLString]];
    [self.headerView setFrame:CGRectMake(0, 0, SCREENWIDTH, (SCREENWIDTH * 9 / 16))];
    self.headerViewHeight = self.headerView.bounds.size.height;
    [self.tableView addSubview:self.headerView];
    self.tableView.contentInset = UIEdgeInsetsMake(self.headerViewHeight, 0, 0, 0);
    self.tableView.contentOffset = CGPointMake(0, -self.headerViewHeight + kNavigationBarHeight);
}
UI测试代码中的

class PopupDialogUITests: XCTestCase {

    override func setUp() {
        super.setUp()

        continueAfterFailure = false
        XCUIApplication().launch()
    }

    override func tearDown() {
        super.tearDown()
    }    

    func testExample() {
        let app = XCUIApplication()

        app.tables.buttons["SettingBtn"].tap()
    }

}

1 个答案:

答案 0 :(得分:1)

我知道自从你提出这个问题以来已经过了一个多月,但我注意到你仍然没有解决你的问题。您使用的是大写' S'在您的字符串的开头指定测试中的辅助功能标识符时,它应该是小写的。

- (void)initAccessibility {
    self.settingButton.isAccessibilityElement = YES;
    self.settingButton.accessibilityIdentifier = @"settingBtn";
    self.settingButton.accessibilityLabel = @"settingBtn";
}

app.tables.buttons["SettingBtn"].tap()