使用Flutter Appium驱动程序自动化颤音应用程序
#java #appium #fultterappautomation #appautomation

Flutter App Automation
为什么Flutter是最受欢迎的跨平台移动SDK ??

为每个移动平台运行一个开发团队都会从其他工作中吸收资源。 Flutter是一个开发团队在所有平台上建立的最受欢迎的方式。

什么是颤音?
Flutter是Google的免费,开源软件开发套件(SDK),用于跨平台移动应用程序开发。使用单个平台 - 不合骨代码库,Flutter可以帮助开发人员构建具有吸引人的Android或iOS功能用户界面的高性能,可扩展的应用程序。 Flutter依靠预制小部件的库,这使得即使是有限的编程或开发经验的人,也可以快速启动自己的移动应用程序。

列表的公司清单与Flutter

进行了值得注意的工作 截至2023年1月,Play商店中有超过700,000个应用程序是用扑朔迷离的,而Play商店中的五分之一的应用程序都使用颤音,而不是所有其他跨平台框架。 Flutter正在从其他跨平台框架中获得市场份额,该框架在过去的十二个月中是平坦或下降的。
最受欢迎的应用程序用Flutter

构建
  1. 阿里巴巴群
  2. Google Pay
  3. bytedance
  4. 宝马
  5. Dream11
  6. Nubank
  7. PUBG移动
  8. aws放大
  9. Google教室
  10. Zerodha

如何自动化颤音应用
Flutter App Automation并不总是很简单。
使用两个阶段的过程呈现flutter应用程序:

  1. 小部件树
  2. 渲染对象树

颤动渲染引擎高效,可以以高框架速率渲染复杂的UI。这是因为渲染引擎使用许多优化,例如缓存渲染对象和批处理绘制调用。

有几种不同的方法可以自动化颤音应用程序。
1。颤动驱动器:

flutter驱动程序用于与应用程序的UI进行交互,验证该应用程序的行为是否如预期并执行其他任务。
要使用Flutter驱动程序,您需要将其依赖性安装在flutter项目中

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_driver:
    sdk: flutter
  test: any

样品测试

import 'package:flutter_driver/driver_extension.dart';
import 'package:test/main.dart' as app;

void main() {
  enableFlutterDriverExtension();
  app.main();
}

test('increments the counter', () async {
      await driver.tap(incrementButtonFinder);

      expect(await driver.getText(counterTextFinder), "1");
    });

使用Flutter驱动程序自动化flutter应用程序时可能会遇到的挑战:

  1. 用其他语言的其他语言写作测试
  2. 使用嵌入式WebView或本机视图或带有嵌入式Flutter View的现有本机应用程序运行Flutter应用程序的集成测试
  3. 同时在多个设备上运行测试(并行运行)
  4. 在设备农场上运行集成测试,例如酱汁实验室,headspin,aws,firebase

2。 Appium Flutter驱动程序

appium flutter驱动程序是用于自动化颤音应用程序的最受欢迎的工具。
Appium是一种跨平台自动化工具,可用于自动化在各种平台上运行的应用程序,包括Flutter。

pre Requisite
您的颤动应用程序(AUT)必须以调试配置文件模式进行编译,因为Flutter驱动程序不支持在发布模式下运行。另外,在运行应用程序之前,请确保您的Flutter Aut具有enableFlutterDriverextension()。然后,请确保您的应用程序导入的flutter_driver软件包也作为其DevDections。

dev_dependencies:
  flutter_test:
    sdk: flutter
  flutter_driver:
    sdk: flutter
  test: any
import 'package:flutter/material.dart';
import 'package:flutter_driver/driver_extension.dart';
import 'package:functional_widget_annotation/functional_widget_annotation.dart';
import 'package:hello_world/stream.dart';

part 'main.g.dart';

void main() {
enableFlutterDriverExtension(enableTextEntryEmulation: false);
 init();
  runApp(MyApp());
}

@widget
Widget myApp() => MaterialApp(
  title: 'Counter App',
  home: MyHomePage(title: 'Counter App Home Page'),
);



@widget
Widget myHomePage(BuildContext context, {String title}) => Scaffold(
  appBar: AppBar(
    title: Text(title),
  ),
  body: Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text(
          'You have pushed the button this many times:',
        ),
        Tooltip(
          message: 'counter_tooltip',
          child: StreamBuilder<int>(
            stream: counterStream,
            builder: (context, snapshot) {
              return Text(
                '${snapshot.data}',
                key: Key('counter'),
                style: Theme.of(context).textTheme.display1,
                semanticsLabel: 'counter_semantic',
              );
            }
          ),
        ),
        FlatButton(
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(
                  builder: (context) => Scaffold(
                        appBar: AppBar(
                          title: Text("Second Route"),
                        ),
                        body: Center(
                          child: SecondPage(),
                        ),
                      )),
            );
          },
          child: Text(
            'Go to next route',
            key: Key('next_route_key'),
          ),
        ),
      ],
    ),
  ),
  floatingActionButton: FloatingActionButton(
    // Provide a Key to this button. This allows finding this
    // specific button inside the test suite, and tapping it.
    key: Key('increment'),
    onPressed: () => plusClickSink.add(null),
    tooltip: 'Increment',
    child: Icon(Icons.add),
  ),
);

@widget
Widget secondPage() => ListView(
  padding: const EdgeInsets.all(8.0),
  children: <Widget>[
    Container(
      height: 100,
      color: Colors.amber[600],
      child: const Center(child: Text('This is 2nd route')),
    ),
    Container(
      height: 200,
      color: Colors.amber[500],
      child: const Center(child: Text('Entry B')),
    ),
    Container(
      height: 500,
      color: Colors.amber[100],
      child: const Center(child: Text('Entry C')),
    ),
    Container(
      height: 1000,
      color: Colors.amber[100],
      child: const Center(child: Text('Entry D')),
    ),
    Container(
      height: 1000,
      color: Colors.amber[100],
      child: const Center(
          child: TextField(
        decoration: InputDecoration(
          border: OutlineInputBorder(),
          labelText: 'Sample Input',
        ),
      )),
    ),
  ],
);

自动化代码:

Add maven dependency to pom.xml
<dependency>
    <groupId>io.github.ashwithpoojary98</groupId>
    <artifactId>appium_flutterfinder_java</artifactId>
    <version>1.0.1</version>
</dependency>

import io.appium.java_client.AppiumDriver;

public class FlutterFinderExampleTest {
    RemoteWebDriver driver;

    @BeforeMethod
    public void openApp() throws MalformedURLException {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability("deviceName", "emulator-5554");
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("noReset", true);
        capabilities.setCapability("app", "");
        capabilities.setCapability("automationName", "Flutter");
        driver = new AppiumDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
    }

    @Test
    public void appiumFlutterTest() {
        FlutterFinder finder = new FlutterFinder(driver);
        WebElement element = finder.byValueKey("increment");
        element.click();
    }

    @AfterMethod
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }
}

GitHub logo ashwithpoojary98 / javaflutterfinder

使用Java实施的弹驱动器

Appium Futter Finder Java

Flutter appium driver is automation tool with java implemantation.

maven-plugin

Build Status

设置

将maven依赖性添加到pom.xml

Maven Center Repo链接

https://mvnrepository.com/artifact/io.github.ashwithpoojary98/appium_flutterfinder_java

用法

  import   io  appium  java_client  appiumdriver 
			 public   class   flutterfinderexampletest  {
			 remotewebdriver  驱动程序;
			@  beforemethod 
			在=“ pl-k”>投掷  MalformedUrlexception  {
			 desiredcapabilities  能力 =  new    DesiredCapabilities ();
			能力 setCapibalibaly “ deviceName” “ Emulator-5554” );
			能力 setcapibalibaly “ platformName” “ android” );
			在 true );
			在“” );
			能力 setcapibalibaly “ automationName” “ flutter” );
			在=“ pl-k”> new   url “ http://0.0.0.0.0:4723/wd /hub“ ),功能);
			在)。 n> n>  30 ));
			}
			@  test 
			在€¦
			

如果您有任何疑问,请随时接触。
gmail:ashwithpoojary98@gmail.com
Insta:Ashwith__poojary
github:https://github.com/ashwithpoojary98

谢谢....