我对在测试中使用flutter驱动程序还是个新手,但据我所知,我们可以用来定位/识别元素的标识符很少,比如按文本、按类型等
但问题是,我想测试的应用程序没有我可以用来定位它们的标识符(如果我错了,请纠正我(。。应用程序的小部件代码看起来像这个
Widget _buildNextButton() {
return Align(
alignment: Alignment.bottomRight,
child: Container(
child: IconButton(
icon: Icon(Icons.arrow_forward),
onPressed: () => _controller.nextPage(),
),
),
);
}
其中该小部件在扩展CCD_ 1的类上。
如何在测试脚本中找到该图标并单击它?我能用这样的东西吗?我应该使用什么类型的取景器?(按ValueKey?按SemanticLabel?按Type?或什么?(
static final arrowKey = find.byValueKey(LoginKey.nextButton);
TestDriverUtil.tap(driver, arrowKey);
我们在Flutter Driver中有文本和值检查,但如果你没有,你总是可以进入应用程序的层次结构。我所说的层次结构是指按钮有固定的或特定的父权限?
让我们在这里举个例子,我们有Align>容器>图标按钮>图标小部件层次结构对其他人来说是不正确的,比如可能有IconButton,但容器父级没有。或StreamBuilder或我们能想到的任何东西。
Widget _buildNextButton() {
return Align(
alignment: Alignment.bottomRight,
child: Container(
child: IconButton(
icon: Icon(Icons.arrow_forward),
onPressed: () => print("clicked button"),
),
),
);
}
这种层次结构至少应该是自上而下或自下而上方法的理想选择。
现在我所说的从上到下的方法是Align必须有IconButton,对于从下到上的方法,我们说IconButton必须有Align小部件作为父级。
在这里,我采用了自上而下的方法,所以我从下面的代码中检查的是找到IconButton,他是Align Widget的核心。此外,我添加了firstMatchOnly true,因为我正在检查如果两者都出现相同的层次结构会发生什么,所以
test('IconButton find and tap test', () async {
var findIconButton = find.descendant(of: find.byType("Align"), matching: find.byType("IconButton"), firstMatchOnly: true);
await driver.waitFor(findIconButton);
await driver.tap(findIconButton);
await Future.delayed(Duration(seconds: 3));
});
要检查是否有多个IconButton与父级具有相同的Align,我们需要有一些区别,比如父级应该有Text视图或其他小部件。
find.descendant(of: find.ancestor(
of: find.byValue("somevalue"),
matching: find.byType("CustomWidgetClass")), matching: find.byType("IconButton"), firstMatchOnly: true)
通常我会去上面这样的地方,我已经把代码拆分到一个单独的文件中,并检查那个小部件。
但最终找到这个小部件的一些独特之处,你就可以着手了。
**In Lib directory dart class for connecting that widget**
class Testing extends StatelessWidget {
Testing();
// This widget is the root of your application.
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: YourClass(), // Next button containing class that need to test
);
}
}
**In Test directory**
testWidgets('Next widget field test', (WidgetTester tester) async {
// Build our app and trigger a frame.
await tester.pumpWidget(Testing());
// find Widget
var buttonFind = find.byIcon(Icons.arrow_forward);
expect(buttonFind, findsOneWidget);
IconButton iconButton = tester.firstWidget(buttonFind);
expect(iconButton.color, Colors.blue);
});