appium-flutter-driver icon indicating copy to clipboard operation
appium-flutter-driver copied to clipboard

Driver not support custom command of flutter driver

Open DangCao1999 opened this issue 1 year ago • 1 comments
trafficstars

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);

DangCao1999 avatar May 17 '24 03:05 DangCao1999

No fix provided still? Have same issue

Time2HackJS avatar Feb 17 '25 15:02 Time2HackJS