Flutter自动化GUI测试插件flutter_auto_gui_windows的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter自动化GUI测试插件flutter_auto_gui_windows的使用

flutter_auto_gui_windowsflutter_auto_gui 的 Windows 版本实现。该插件允许开发者通过 Flutter 应用来控制和测试 Windows 上的图形用户界面。

使用方法

此插件为 Flutter 开发者提供了便捷的方式来使用 GUI 自动化功能。由于该插件被标记为 endorsed federated plugin,你只需要在项目中正常使用 flutter_auto_gui 即可,该插件会自动包含进来。

完整示例Demo

以下是一个完整的示例代码,展示了如何使用 flutter_auto_gui_windows 插件来控制鼠标和键盘操作。

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_auto_gui_windows/flutter_auto_gui_windows.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _api = FlutterAutoGuiWindows();
  final TextEditingController controller = TextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Auto GUI'),
        ),
        body: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              children: [
                TextField(
                  controller: controller,
                ),
                Row(
                  children: [
                    Expanded(
                      child: Column(
                        children: [
                          const Text('Mouse API'),
                          Wrap(
                            spacing: 5,
                            runSpacing: 5,
                            children: [
                              ElevatedButton(
                                onPressed: () async {
                                  Point<int>? p = await _api.position();
                                  controller.text =
                                      'Mouse Position = ${p.toString()}';
                                },
                                child: const Text('Mouse Position'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await _api.moveTo(
                                    point: const Point(10, 10),
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Move to 10, 10'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await _api.moveToRel(
                                    offset: const Size(100, -100),
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Move to rel 100, -100'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.dragTo(
                                    point: const Point(100, 100),
                                    button: MouseButton.left,
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Drag to 100, 100'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.dragToRel(
                                    offset: const Size(200, 300),
                                    button: MouseButton.left,
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Drag to rel 100, 0'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.mouseDown(
                                    button: MouseButton.left,
                                  );
                                },
                                child: const Text('Set Left Button Down'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.mouseUp(
                                    button: MouseButton.left,
                                  );
                                },
                                child: const Text('Set Left Button Up'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.click(
                                    button: MouseButton.left,
                                    clicks: 1,
                                  );
                                },
                                child: const Text('Single click left button'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.click(
                                    button: MouseButton.left,
                                    clicks: 2,
                                  );
                                },
                                child: const Text('Double click left button'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.scroll(
                                    axis: Axis.vertical,
                                    clicks: 5,
                                  );
                                },
                                child: const Text(
                                    'Vertical Scroll up for 5 clicks'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  await _api.scroll(
                                    axis: Axis.horizontal,
                                    clicks: 5,
                                  );
                                },
                                child: const Text(
                                    'Horizontal Scroll right for 5 clicks'),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                    Expanded(
                      child: Column(
                        children: [
                          const Text('Keyboard API'),
                          Wrap(
                            spacing: 5,
                            runSpacing: 5,
                            children: [
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  _api.keyDown(key: 'w');
                                },
                                child: const Text('W key down'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  _api.keyUp(key: 'w');
                                },
                                child: const Text('W key up'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  _api.press(
                                    key: 'w',
                                    times: 2,
                                    interval: const Duration(
                                      seconds: 2,
                                    ),
                                  );
                                },
                                child: const Text(
                                    'Press W key up 2 time over 2 seconds'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  _api.write(
                                    text: 'hellO wOrld!',
                                    interval: const Duration(
                                      milliseconds: 1000,
                                    ),
                                  );
                                },
                                child: const Text('Writes \'hellO wOrld!\''),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  await Future.delayed(
                                      const Duration(seconds: 2));
                                  _api.hotkey(
                                    keys: ['ctrl', 'shift', 'esc'],
                                  );
                                },
                                child: const Text(
                                    'Hotkey (control + shift + escape)'),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                    Expanded(
                      child: Column(
                        children: [
                          const Text('Screen API'),
                          Wrap(
                            spacing: 5,
                            runSpacing: 5,
                            children: const [],
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自动化GUI测试插件flutter_auto_gui_windows的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动化GUI测试插件flutter_auto_gui_windows的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,flutter_auto_gui_windows 是一个用于 Flutter 应用的自动化 GUI 测试插件,特别针对 Windows 平台。虽然我不能直接提供该插件的官方代码(因为我没有访问到具体的实现细节),但我可以展示一个假设的使用案例,以便你了解如何在 Flutter 项目中集成和使用它。

请注意,以下代码是基于假设的 API 设计,实际使用时请查阅该插件的官方文档和源代码。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 flutter_auto_gui_windows 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_auto_gui_windows: ^x.y.z  # 替换为实际的版本号

然后运行 flutter pub get 来获取依赖。

2. 导入插件

在你的测试文件中导入插件:

import 'package:flutter_auto_gui_windows/flutter_auto_gui_windows.dart';

3. 初始化插件并编写测试

假设 flutter_auto_gui_windows 提供了类似于 Selenium 的 API,你可以这样编写测试:

void main() {
  // 初始化插件(假设需要)
  FlutterAutoGuiWindows gui = FlutterAutoGuiWindows();

  test('check if the button is clickable', () async {
    // 启动应用(如果需要)
    // await gui.startApp('path/to/your/flutter/app');

    // 查找元素(假设使用 XPath 或其他选择器)
    var button = await gui.findElement(By.id('my_button_id'));

    // 检查元素是否可点击
    expect(await button.isDisplayed, isTrue);
    expect(await button.isEnabled, isTrue);

    // 点击按钮
    await button.click();

    // 验证点击后的状态(例如,检查某个文本是否出现)
    var resultText = await gui.findElement(By.id('result_text_id'));
    expect(await resultText.text, equals('Expected Result'));

    // 关闭应用(如果需要)
    // await gui.quitApp();
  });
}

4. 运行测试

使用 Flutter 的测试命令运行你的测试:

flutter test test/your_test_file.dart

注意事项

  1. API 假设:上面的代码是基于假设的 API 设计。实际使用时,你需要查阅 flutter_auto_gui_windows 的官方文档来了解其具体的 API 和用法。
  2. 依赖项:确保你的 Flutter 环境已经正确配置,并且所有依赖项都已正确安装。
  3. 平台限制:由于 flutter_auto_gui_windows 专门针对 Windows 平台,因此这些测试只能在 Windows 上运行。

结论

虽然上面的代码是一个假设的示例,但它展示了如何在 Flutter 项目中使用自动化 GUI 测试插件的基本结构。实际使用时,请查阅 flutter_auto_gui_windows 的官方文档和源代码,以获取准确的 API 信息和用法示例。

回到顶部