查找没有键的元素
Finds Element without key
我对在测试中使用 flutter 驱动程序还是个新手,但据我所知,我们可以使用很少的标识符来定位/识别元素,例如按文本、按类型等
但问题是,我要测试的应用程序没有我可以用来定位它们的标识符(如果我错了,请纠正我)..应用程序的小部件代码看起来像这个
Widget _buildNextButton() {
return Align(
alignment: Alignment.bottomRight,
child: Container(
child: IconButton(
icon: Icon(Icons.arrow_forward),
onPressed: () => _controller.nextPage(),
),
),
);
}
该小部件位于扩展 StatefulWidget
.
的 class 上
如何在我的测试脚本中找到该图标并单击它?我可以使用这样的东西吗?我应该使用什么类型的取景器? (byValueKey?bySemanticLabel?byType?还是什么?)
static final arrowKey = find.byValueKey(LoginKey.nextButton);
TestDriverUtil.tap(driver, arrowKey);
**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);
});
我们在 Flutter Driver 中有文本和值检查,但如果您没有,您可以随时进入应用程序的层次结构。
我所说的层次结构是指按钮具有修复或特定父级权利吗?
让我们在这里举个例子,我们有 Align > Container > IconButton > Icon widget hierarchy 这对其他人来说是不正确的,比如可能有 IconButton 但没有 Container 父级。
或 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));
});
要检查多个 IconButtons 与父级具有相同的对齐方式,我们需要有一些区别,比如父级应该有文本视图或其他小部件。
find.descendant(of: find.ancestor(
of: find.byValue("somevalue"),
matching: find.byType("CustomWidgetClass")), matching: find.byType("IconButton"), firstMatchOnly: true)
通常我会像上面那样将代码拆分到单独的文件中并检查该小部件。
但最终会发现该小部件的一些独特之处,您可以对其进行处理。
我对在测试中使用 flutter 驱动程序还是个新手,但据我所知,我们可以使用很少的标识符来定位/识别元素,例如按文本、按类型等
但问题是,我要测试的应用程序没有我可以用来定位它们的标识符(如果我错了,请纠正我)..应用程序的小部件代码看起来像这个
Widget _buildNextButton() {
return Align(
alignment: Alignment.bottomRight,
child: Container(
child: IconButton(
icon: Icon(Icons.arrow_forward),
onPressed: () => _controller.nextPage(),
),
),
);
}
该小部件位于扩展 StatefulWidget
.
如何在我的测试脚本中找到该图标并单击它?我可以使用这样的东西吗?我应该使用什么类型的取景器? (byValueKey?bySemanticLabel?byType?还是什么?)
static final arrowKey = find.byValueKey(LoginKey.nextButton);
TestDriverUtil.tap(driver, arrowKey);
**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);
});
我们在 Flutter Driver 中有文本和值检查,但如果您没有,您可以随时进入应用程序的层次结构。 我所说的层次结构是指按钮具有修复或特定父级权利吗?
让我们在这里举个例子,我们有 Align > Container > IconButton > Icon widget hierarchy 这对其他人来说是不正确的,比如可能有 IconButton 但没有 Container 父级。 或 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));
});
要检查多个 IconButtons 与父级具有相同的对齐方式,我们需要有一些区别,比如父级应该有文本视图或其他小部件。
find.descendant(of: find.ancestor(
of: find.byValue("somevalue"),
matching: find.byType("CustomWidgetClass")), matching: find.byType("IconButton"), firstMatchOnly: true)
通常我会像上面那样将代码拆分到单独的文件中并检查该小部件。
但最终会发现该小部件的一些独特之处,您可以对其进行处理。