为什么 XCTest 在 UITableViewCell 中公开一个随机的 otherElement? (并表现出其他不一致之处)
Why is XCTest exposing a random otherElement in a UITableViewCell? (and exhibiting other inconsistencies)
我创建了一个新的单视图项目并添加了这段代码来创建一个 UITableView。
- (void)viewDidLoad {
[super viewDidLoad];
tableView=[[UITableView alloc]init];
tableView.frame = CGRectMake(10,30,320,400);
tableView.dataSource=self;
tableView.delegate=self;
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[tableView reloadData];
[self.view addSubview:tableView];
}
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"hello";
cell.textLabel.accessibilityIdentifier = @"world";
return cell;
}
我的 UI 测试简单地打印了带有 print(app.debugDescription)
的视图层次结构,正如您所看到的,主图 window 有 2 个叶视图:一个 StaticText
对应cell.textLabel
和 unidentified/random Other
视图。我已经尝试了很多方法来弄清楚这个 Other
视图是什么,但我却找不到答案。
Element subtree:
→Application, 0x600000d98820, pid: 17292, label: 'TestApp'
Window (Main), 0x600000d989c0, {{0.0, 0.0}, {768.0, 1024.0}}
Other, 0x600000d98a90, {{0.0, 0.0}, {768.0, 1024.0}}
Table, 0x600000d98b60, {{10.0, 30.0}, {320.0, 400.0}}
Cell, 0x600000d98c30, {{10.0, 30.0}, {320.0, 44.0}}
StaticText, 0x600000d98d00, {{25.0, 30.0}, {290.0, 43.5}}, identifier: 'world', label: 'hello'
Other, 0x600000d98dd0, {{25.0, 73.5}, {305.0, 0.5}}
也许更多的是this UITableViewCell odd/unexplained behavior?
导致我这样做的另一个奇怪之处是当包含 UILabel
的 UIScrollView
添加到 UITableViewCell
时,UIScrollView
没有出现在层次结构中.所以这个:
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0,0, 5,5)];
[lb setText:@"hello world"];
[sv addSubview:lb];
[[cell contentView] addSubview:sv];
return cell;
}
产生这个:
Element subtree:
→Application, 0x6000014e75a0, pid: 20372, label: 'TestApp'
Window (Main), 0x6000014e7190, {{0.0, 0.0}, {768.0, 1024.0}}
Other, 0x6000014e6ff0, {{0.0, 0.0}, {768.0, 1024.0}}
Table, 0x6000014e6f20, {{10.0, 30.0}, {320.0, 400.0}}
Cell, 0x6000014e6e50, {{10.0, 30.0}, {320.0, 44.0}}
StaticText, 0x6000014e6d80, {{10.0, 30.0}, {5.0, 5.0}}, label: 'hello world'
Other, 0x6000014e6cb0, {{25.0, 73.5}, {305.0, 0.5}}
鉴于此(不涉及 table 或单元格):
- (void)viewDidLoad {
[super viewDidLoad];
UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0,0, 5,5)];
[lb setText:@"hello world"];
[sv addSubview:lb];
[self.view addSubview:sv];
}
似乎工作得很好:
Element subtree:
→Application, 0x600000278750, pid: 20442, label: 'TestApp'
Window (Main), 0x6000002788f0, {{0.0, 0.0}, {768.0, 1024.0}}
Other, 0x600000278820, {{0.0, 0.0}, {768.0, 1024.0}}
ScrollView, 0x6000002789c0, {{0.0, 0.0}, {10.0, 10.0}}
StaticText, 0x600000278a90, {{0.0, 0.0}, {5.0, 5.0}}, label: 'hello world'
我的想法是,这在某种程度上与 isAccessibilityElement
、accessibilityTraits
以及视图是否为容器决定了暴露的内容有关,但这种不一致令人困惑,我希望有人知道秘方。
这个其他元素是单元格之间的分隔线。
由于这些行不会影响其他元素,因此它们不应该打扰您。
当您使某些元素可访问时,其后代不会出现在 UI 测试元素树中。
我创建了一个新的单视图项目并添加了这段代码来创建一个 UITableView。
- (void)viewDidLoad {
[super viewDidLoad];
tableView=[[UITableView alloc]init];
tableView.frame = CGRectMake(10,30,320,400);
tableView.dataSource=self;
tableView.delegate=self;
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
[tableView reloadData];
[self.view addSubview:tableView];
}
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = @"hello";
cell.textLabel.accessibilityIdentifier = @"world";
return cell;
}
我的 UI 测试简单地打印了带有 print(app.debugDescription)
的视图层次结构,正如您所看到的,主图 window 有 2 个叶视图:一个 StaticText
对应cell.textLabel
和 unidentified/random Other
视图。我已经尝试了很多方法来弄清楚这个 Other
视图是什么,但我却找不到答案。
Element subtree:
→Application, 0x600000d98820, pid: 17292, label: 'TestApp'
Window (Main), 0x600000d989c0, {{0.0, 0.0}, {768.0, 1024.0}}
Other, 0x600000d98a90, {{0.0, 0.0}, {768.0, 1024.0}}
Table, 0x600000d98b60, {{10.0, 30.0}, {320.0, 400.0}}
Cell, 0x600000d98c30, {{10.0, 30.0}, {320.0, 44.0}}
StaticText, 0x600000d98d00, {{25.0, 30.0}, {290.0, 43.5}}, identifier: 'world', label: 'hello'
Other, 0x600000d98dd0, {{25.0, 73.5}, {305.0, 0.5}}
也许更多的是this UITableViewCell odd/unexplained behavior?
导致我这样做的另一个奇怪之处是当包含 UILabel
的 UIScrollView
添加到 UITableViewCell
时,UIScrollView
没有出现在层次结构中.所以这个:
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath] ;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0,0, 5,5)];
[lb setText:@"hello world"];
[sv addSubview:lb];
[[cell contentView] addSubview:sv];
return cell;
}
产生这个:
Element subtree:
→Application, 0x6000014e75a0, pid: 20372, label: 'TestApp'
Window (Main), 0x6000014e7190, {{0.0, 0.0}, {768.0, 1024.0}}
Other, 0x6000014e6ff0, {{0.0, 0.0}, {768.0, 1024.0}}
Table, 0x6000014e6f20, {{10.0, 30.0}, {320.0, 400.0}}
Cell, 0x6000014e6e50, {{10.0, 30.0}, {320.0, 44.0}}
StaticText, 0x6000014e6d80, {{10.0, 30.0}, {5.0, 5.0}}, label: 'hello world'
Other, 0x6000014e6cb0, {{25.0, 73.5}, {305.0, 0.5}}
鉴于此(不涉及 table 或单元格):
- (void)viewDidLoad {
[super viewDidLoad];
UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
UILabel *lb = [[UILabel alloc] initWithFrame:CGRectMake(0,0, 5,5)];
[lb setText:@"hello world"];
[sv addSubview:lb];
[self.view addSubview:sv];
}
似乎工作得很好:
Element subtree:
→Application, 0x600000278750, pid: 20442, label: 'TestApp'
Window (Main), 0x6000002788f0, {{0.0, 0.0}, {768.0, 1024.0}}
Other, 0x600000278820, {{0.0, 0.0}, {768.0, 1024.0}}
ScrollView, 0x6000002789c0, {{0.0, 0.0}, {10.0, 10.0}}
StaticText, 0x600000278a90, {{0.0, 0.0}, {5.0, 5.0}}, label: 'hello world'
我的想法是,这在某种程度上与 isAccessibilityElement
、accessibilityTraits
以及视图是否为容器决定了暴露的内容有关,但这种不一致令人困惑,我希望有人知道秘方。
这个其他元素是单元格之间的分隔线。 由于这些行不会影响其他元素,因此它们不应该打扰您。
当您使某些元素可访问时,其后代不会出现在 UI 测试元素树中。