我想检查一个元素是否存在。类似于返回布尔值的函数。或者类似于Selenium'ifExists'中的函数,如果元素不一定存在则不会抛出异常,并且在没有找到元素的情况下继续执行该过程而不会停止。 flutter_test上存在类似的东西,但到目前为止我还没有和flutter_driver一起使用它。
答案 0 :(得分:0)
根据Flutter issue #15852,到目前为止,目前还没有这种可能性。
但是,用户jonsamwell在本期中提到的一种解决方法是,通过flutter驱动程序使用waitFor
方法,并将其包装在try / catch中,以等待超时。如果超时,则该元素不存在;如果超时,则该元素存在:
Future<void> testStep() async {
final isOpen = await isPresent(find.byType("Drawer"), world.driver);
if (isOpen) {
...
}
}
Future<bool> isPresent(SerializableFinder finder, FlutterDriver driver, {Duration timeout = const Duration(seconds: 1)}) async {
try {
await driver.waitFor(finder, timeout: timeout);
return true;
} catch (e) {
return false;
}
}
显然,您必须根据用例计算等待时间,以考虑任何加载时间。
答案 1 :(得分:0)
尝试捕获方法对我不起作用。
我写了一段和平的代码来为我做花招
Future<bool> isPresent(SerializableFinder finder, FlutterDriver driver, {Duration timeout = const Duration(seconds: 1)}) async {
Stopwatch s = new Stopwatch();
s.start();
await driver.waitFor(finder, timeout: timeout);
s.stop();
if(s.elapsedMilliseconds >= timeout.inMilliseconds){
return false;
}else{
return true;
}
}
Future<void> testStep() async {
final exists = await isPresent(find.byValueKey("accountMenu"), driver);
if (exists ) {
...
}
}
如果“ driver.waitFor”函数找到我们的小部件所花费的时间超过了超时时间,则该小部件不存在。