appium / appium-flutter-driver

Appium Flutter Driver is a test automation tool for Flutter apps on multiple platforms/OSes. Appium Flutter Driver is part of the Appium mobile test automation tool maintained by community
MIT License
440 stars 179 forks source link

Driver not support custom command of flutter driver #688

Open DangCao1999 opened 1 month ago

DangCao1999 commented 1 month ago

The flutter allows us add new custom command extension CommandExtension But the appium flutter driver just allows the basic command execute

I tried to use @appium/execute-driver-plugin to reach to driver.executeElementCommand but can not. Could I implement more code for custom commands?

Example for flutter code

import 'package:flutter/material.dart';
import 'package:flutter_driver/src/common/find.dart';
import 'package:flutter_driver/src/common/message.dart';
import 'package:flutter_test/src/controller.dart';
import 'package:flutter_test/src/finders.dart';
import 'package:flutter_driver/driver_extension.dart';

import './main.dart' as app;

/// Custom command
class CustomCommandResult extends Result {
  final Finder finder;
  const CustomCommandResult(this.finder);

  @override
  Map<String, dynamic> toJson() {
    return <String, dynamic>{
      "hasFound": finder.hasFound,
      // "foundMany": finder.found.toList().length,
    };
  }
}

class CustomCommand extends CommandWithTarget {
  CustomCommand(super.finder);

  @override
  String get kind => 'checkVisible';

  CustomCommand.deserialize(super.json, super.finderFactory)
      : super.deserialize();
}

class CustomCommandExtension extends CommandExtension {
  @override
  Future<Result> call(Command command, WidgetController prober,
      CreateFinderFactory finderFactory, CommandHandlerFactory handlerFactory) {
    FlutterDriverExtension flutterDriverExtension =
        handlerFactory as FlutterDriverExtension;

    final CustomCommand customCommand = command as CustomCommand;

    Finder finder = flutterDriverExtension.createFinder(customCommand.finder);

    return Future.value(CustomCommandResult(finder));
  }

  @override
  String get commandKind => "checkVisible";

  @override
  Command deserialize(
      Map<String, String> params,
      DeserializeFinderFactory finderFactory,
      DeserializeCommandFactory commandFactory) {
    return CustomCommand.deserialize(params, finderFactory);
  }
}

void main() {
  enableFlutterDriverExtension(
      commands: [CustomCommandExtension()]);
  app.main();
}

Example for client script

driver.execute("flutter:commandExtension", "checkVisible", finder);