首页 > 其他分享 >35.基于图像匹配的自动化测试

35.基于图像匹配的自动化测试

时间:2023-12-26 11:44:07浏览次数:32  
标签:自动化 opencv4nodejs desiredCapabilities driver appium 35 setCapability 图像匹配

图像匹配的自动化测试

介绍技术

价值与用途

  • 解决特殊场景的自动化测试问题
    • 不可识别控件,自定义控件、图片控件、滑块
    • 安全性较高控件,比如安全键盘
    • 特殊渲染引擎,比如游戏 app
  • 作为常规自动化测试的补充
    • 图像识别速度较慢
    • 游戏控件通过自定义可以实现控件识别

基于图像匹配的自动化测试框架

  • airtest,适合纯游戏自动化测试场景
  • appium,适合常规与特殊控件的结合场景
  • sikuliX,老牌工具

appium 图像匹配能力支持

  • appium 1.8 版本新增
  • 基于 opencv + 匹配算法
  • 图像匹配相关的 API
  • 自动化相关的 API

图像匹配 API

  • 子图像查找 findImageOccurrence
  • 匹配算法 matchImagesFeatures
  • 相似度计算 getImagesSimilarity

环境准备

  • 安装 opencv4nodejs
  • 注意 appium 的报错
    • Cannot find module /usr/local/lib/node_modules/opencv4nodejs/build/Release/opencv4nodejs
    • Encountered internal error running command: Error: ‘opencv4nodejs’ module is required to use OpenCV features. Please install it first (‘npm i -g opencv4nodejs’) and restart Appium. Read https://github.com/justadudewhohacks/opencv4nodejs#how-to-install for more details on this topic.

安装 opencv4nodejs

npm install -g opencv4nodejs

# mac安装
export OPENCV4NODEJS_DISABLE_AUTOBUILD=1
npm install -g opencv4nodejs

cd $(npm root -g)/opencv4nodejs/
export OPENCV4NODEJS_AUTOBUILD_FLAGS=-DBUILD_LIST=core,imgproc,imgcodecs,videoio,highgui,video,calib3d,features2d,objdetect,dnn,ml,flann,photo,stitching,gapi
npm i --save opencv-build
node install/install.js

capability 与 settings 设置

        desiredCapabilities.setCapability("settings[fixImageFindScreenshotDims]", false);
        desiredCapabilities.setCapability("settings[fixImageTemplateSize]", true);
        desiredCapabilities.setCapability("settings[getMatchedImageResult]", true)
        desiredCapabilities.setCapability("settings[imageMatchThreshold]", 0.4)

基于图像识别的自动化测试 java 版

public class ImageTest {

    private static final ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
    private static AndroidDriver driver;

    @BeforeAll
    public static void beforeAll() throws MalformedURLException {
        DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
        desiredCapabilities.setCapability("platformName", "android");
        desiredCapabilities.setCapability("noReset", true);
        desiredCapabilities.setCapability("appPackage", "io.appium.android.apis");
        desiredCapabilities.setCapability("appActivity", "io.appium.android.apis.ApiDemos");
//        desiredCapabilities.setCapability("settings[fixImageFindScreenshotDims]", false);
//        desiredCapabilities.setCapability("settings[fixImageTemplateSize]", true);
//        desiredCapabilities.setCapability("settings[getMatchedImageResult]", true);

        URL url = new URL("http://127.0.0.1:4723/wd/hub");
        driver = new AndroidDriver(url, desiredCapabilities);
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

    }

    /**
     * 测试appium-opencv图像识别测试
     */
    @Test
    public void testOpenCV() throws InterruptedException, IOException {
        driver.findElement(AppiumBy.accessibilityId("Graphics")).click();
        driver.findElement(AppiumBy.accessibilityId("BitmapMesh")).click();


        WebElement noseElement = driver.findElement(AppiumBy.image(getImageAsBase64String("src/test/java/com/ceshiren/hogwarts/appium/nose.png")));
        System.out.println(mapper.writeValueAsString(noseElement.getRect()));
        noseElement.click();

        driver.setSetting(Setting.IMAGE_MATCH_THRESHOLD, 0.5);
        WebElement flowerElement = driver.findElement(AppiumBy.image(getImageAsBase64String("src/test/java/com/ceshiren/hogwarts/appium/flower.png")));
        System.out.println(mapper.writeValueAsString(flowerElement.getRect()));
        flowerElement.click();
    }

    private String getImageAsBase64String(String imagePath) throws IOException {
        return Base64.getEncoder().encodeToString(Files.readAllBytes(Path.of(imagePath)));
    }
}

基于图像识别的自动化测试 python 版

class TestImage:
    def setup_class(self):
        capabilities = {
            'platformName': 'android',
            'appPackage': 'io.appium.android.apis',
            'appActivity': 'io.appium.android.apis.ApiDemos'
        }
        self.driver = webdriver.Remote('http://localhost:4723/wd/hub', capabilities)
        self.driver.implicitly_wait(10)

    def test_image(self):
        self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, 'Graphics').click()
        self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, 'BitmapMesh').click()
        self.driver.find_element_by_image("nose.png").click()
        self.driver.find_element_by_image("flower.png").click()

标签:自动化,opencv4nodejs,desiredCapabilities,driver,appium,35,setCapability,图像匹配
From: https://www.cnblogs.com/csfsz/p/17927798.html

相关文章

  • Tomcat自动化脚本
    /bin/bashwar包名称war_name="tchg.war"要上传war包指定目录war_dir="/usr/local/src/tchg"工程地址code_dir="/Lims/tchg/apache-tomcat-9.0.48/webapps/tchg"tomcat地址tomcat_dir="/Lims/tchg/apache-tomcat-9.0.48"工程war地址war_webapps=&......
  • 强!推荐一款自动化神器Autolt:不再重复工作
    随着互联网不断发展,它给我们带来便利的同时,也带来了枯燥、重复、机械的重复工作。今天,我要和大家分享一款老牌实用的自动化工具:AutoIt,它能够让你告别繁琐的重复性工作,提高工作效率。这里透露一下,AutoIt算是作者在10年前,用的最多的一款自动化测试工具了。当时自动化测试工具还并......
  • P5350 序列
    题意维护一个序列:区间查询区间赋值区间加法区间复制区间交换区间翻转数据随机。Sol珂朵莉。前\(3\)个操作很\(trivial\)。考虑区间复制。先把两个区间\(split\)出来。然后扔进\(vector\),全部\(erase\)掉。再用\(vector\)\(insert\)进去。随便搞搞就过......
  • 盘点一个Python自动化办公实战案例(二)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【钟爱一生】问了一个Python自动化办公的问题,一起来看看吧。【温馨提示】遇到表达不清的,能稍微描述下,想要达成的结果吗?在excel上,或者画图也行。最好是把你想要的结果展示在excel中,另外,你展示的这个表格最好做个小的demo......
  • # yyds干货盘点 # 盘点一个Python自动化办公实战案例(二)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【钟爱一生】问了一个Python自动化办公的问题,一起来看看吧。【温馨提示】遇到表达不清的,能稍微描述下,想要达成的结果吗?在excel上,或者画图也行。最好是把你想要的结果展示在excel中,另外,你展示的这个表格最好做个小的demo发上来......
  • 好用的接口自动化测试工具
    Apipost提供可视化的API自动化测试功能,使用Apipost研发人员可以设计、调试接口,测试人员可以基于同一数据源进行测试,Apipost接口自动化功能在上次更新中进行了逻辑调整,带来更好的交互操作、更多的控制器选择,同时新增同步接口模式选择、测试数据选择功能。添加接口使用Apipost,......
  • 不用写代码!UI自动化测试平台
    UI自动化测试已经成为现代软件开发过程中不可或缺的一部分。它能够提供诸多优势,包括提高测试效率、减少人力成本、提升软件质量等。同时,可视化工具为UI自动化测试带来了更多便利和灵活性。然而,可视化工具也存在一些潜在的劣势。本文将探讨UI自动化测试的必要性以及可视化工具的优......
  • 接口自动化测试复习巩固第二天,管理员后端验证和接口抓包+requests实现
    接口自动化测试第二天,需要用到的第三方库有os,openpyxl,json,pytest,requests首选我们今天的目标是写出一个测试登录用例的脚本,这里我用的是分层设计,整个框架暂时被分为工具层,测试数据层,用例层。工具层:这里我会先放目前需要用到的脚本测试数据层:用例执行时需要的测试数据,我会以exce......
  • Programming Abstractions in C阅读笔记:p235-p241
    《ProgrammingAbstractionsinC》学习第66天,p235-p241总结。一、技术总结1.backtrackingalgorithm(回溯算法)(1)定义p236,Formanyreal-worldproblem,thesolutionprocessconsitsofworkingyourwaythroughasequenceofdecisionpointsinwhicheachchoicleadsyo......
  • 人工智能和云计算带来的技术变革:工业自动化的新趋势
    1.背景介绍随着人工智能(AI)和云计算技术的发展,我们正面临着一场巨大的技术变革。这些技术正在改变我们的生活方式、工作方式和社会结构。在工业自动化领域,人工智能和云计算技术正在为我们提供新的可能性和挑战。本文将探讨这些技术如何影响工业自动化,以及未来的发展趋势和挑战。1.1......