前端工程师用Node.js + Appium实现APP自动化

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 网上全是python + Appium的教程,Appium也支持Node.js开发,使用Node.js + Appium实现了自动化爬虫功能。

简介

最近在使用Appium做爬虫功能,网上全是python + Appium的教程,Appium也支持Node.js开发,作为前端工程师使用Node.js + Appium实现了自动化爬虫功能

零零散散折腾了小两天的时间,踩了一些小坑,把流程和坑点整理出来供大家参考,希望让大家少踩坑、快速实现功能。

原理介绍

image.png

我们先搞清楚几个概念,看Appium是如何实现自动操作设备的,结合图片从右往左看:

  • Device是设备,有安卓、IOS、Windows、Mac等不同类型的设备。
  • Appium是一个Web服务器,与设备连接,可以通过接口来操作设备,实现自动化,本身也是Node应用。
  • Driver是驱动程序,不同的设备需要不同的驱动程序去控制,驱动程序属于Appium架构中的一部分。
  • Client即调用Appium接口的客户端,支持不同语言调用,比如Java、Node等语言调用。

总结:用Java、Node.js作为客户端调用 Appium服务端接口,Appium通过驱动控制设备,实现自动化操作。

环境搭建

不再一一介绍每个依赖的安装步骤,网上搭建环境的文章很多,主要是如下两点功能:

  1. 安装Java、Android的SDK,确保 adb命令可用,用于连接手机。
  2. 安装Node.js,用于运行Appium 和 webdriver.io(Client Node.js)。

adb命令使用

adb 简介,可以通过数据线或WIFI实现电脑与手机的连接,手机需要打开开发者调试选项,连接成功后,可以通过adb命令操作手机、安装、调试应用。

  • 查看设备列表:adb devices,如果成功连接手机,输入该命令后会展示设备列表。

image.png

  • 安装APK:adb install + apk路径

image.png

  • 查看当前打开的App包名与appActivity:

image.png
例如微信:com.tencent.mm 是包名,.ui.launcherUI 是 appActivity,这些参数在后边开发自动化功能时使用

Appium 服务启动

有两种方式启动服务,一种是安装命令行工具,通过命令行启动;第二种是安装 AppiumDesktop GUI软件启动,任选其一即可,作为前端工程师,首选命令行。

// 安装命令行
$ npm i --location=global appium

// 安装驱动
$ appium driver install uiautomator2

// 启动服务
$ appium

image.png

坑点1 不同手机的ADB设置

Appium启动后,会在手机上自动安装3个App,这里有个坑,不同的手机系统开发者选型设置不同,可能会有不同的问题,亲测我的VIVO和OPPO机型,Vivo必须允许三个App为高耗电后台运行,OPPO开发者选项中需要需要开启禁止权限监控,否则无法自动安装App,其他同事出现了App总是重复安装的问题。

小Tips:通过 Appium + 手机品牌 去搜索问题,更高效。
image.png
image.png

页面元素定位工具

appium inspector官方的GUI界面定位工具,可以通过参数启动App,并将App的画面和页面结构展示出来,以微信为例:填入我们获取到的appPackage 和 appActivity。
image.png

坑点2 启动参数务必增加 appium:noReset为true

这里有一个坑需要注意,必须设置appium:noReset参数为true,不然每次启动会清空你的App历史数据,我的微信数据被清理了 🙂。

image.png
点击Start Session按钮就可以看到页面的截图、结构和元素的信息了。
image.png

自动化开发

如果通过adb连接手机,并通过 appium inspector 成功获取到界面元素,那么恭喜你已经完成了80%的进展,剩下的就是通过Node.js + webdriver.io 开发自动化脚本,App自动跑起来了。

开发前这里我们要掌握webdriver.io的几个基本用法:

  1. 连接设备
  2. 通过页面元素选择器实现元素的单选、多选。
  3. 获取元素属性、点击元素。
  4. 滑动页面
  5. 保存图片

webdriver.io 的选择器和jquery的语法很类似,看一个Demo相信你就掌握了。

// 引入lib
const {
   
    remote } = require('webdriverio');


// 微信应用启动配置
const capabilities = {
   
   
  platformName: 'Android',
  'appium:automationName': 'UiAutomator2',
  'appium:deviceName': 'Android',
  'appium:appPackage': 'com.tencent.mm',  // 包名
  'appium:appActivity': '.ui.LauncherUI', // 启动页
  "appium:noReset": true, // 不复位数据
  "appium:unicodeKeyboard": false // 隐藏键盘
};


// Appium配置
const wdOpts = {
   
   
  hostname: process.env.APPIUM_HOST || 'localhost',
  port: parseInt(process.env.APPIUM_PORT, 10) || 4723,
  logLevel: 'info',
  capabilities,
};


// 入口
async function main() {
   
   

  // 设备实例
  const driver = await remote(wdOpts);

  try {
   
   

    // 通过Xpath获取元素
    // 单选  类名 + text
    const findBtn = await driver.$('//android.widget.TextView[@text="发现"]');
    // 单选  类名 + resource-id
    const myBtn = await driver.$('//android.widget.ImageView[@resource-id="com.tencent.mm:id/huj"]');
    // 多选 + 类名 + resource-id
    const commentList = await driver.$$('//android.widget.LinearLayout[@resource-id="com.tencent.mm:id/h1r"]');

    // 获取元素 text 属性
    const timeSel = await driver.$('//android.widget.ImageView[@resource-id="com.tencent.mm:id/huj"]');
    const time = await timeSel.getAttribute('text')

    // 点击元素
    await findBtn.click()


    // 向上滑动 开始坐标 + 滑动时间 + 结束坐标
    await driver.touchAction([
      {
   
   action: 'press', x: 379, y: 2098},
      {
   
   action: 'wait', ms: '2000'},
      {
   
   action: 'moveTo', x: 375, y: 606},
      'release'
    ]);

    // 暂停 1秒
    await driver.pause(1000);  

    // 保存图片
    const avatarSel = await item.$('//android.widget.ImageView[@resource-id="com.tencent.mm:id/a27"]');
    await avatarSel.saveScreenshot('./avatar.png');


  } finally {
   
   
    await driver.pause(1000);
    await driver.deleteSession();
  }
}

main().catch(console.error);

坑点3 滑动操作加时间

webdriver.io的文档中关于滑动操作,并没有提示必须加滑动时间,但实际开发中不加滑动时间,在App上会变成点击 + 滑动操作,经常会出现类似长按的操纵,所以务必加上wait的参数。

坑点4 键盘会被隐藏

unicodeKeyboard设置为false会将你的手机输入法关掉,重新启动输入法应用就可以了,还没研究清楚unicodeKeyboard参数的意义,大家实践后可以补充下。

效果展示

掌握选择器和操作语法后,前端工程师就能很快的实现自己的功能了,下边的截图是爬取我的微信视频号中的评论数据。
image.png

image.png
image.png

总结

我们再回顾下:

  • 环境:安卓JavA、Android的SDK,安装Node.js 和 Appium命令行。
  • 工具:adb连手机看参数、 Appium命令行启动服务、appium-inspector查看页面元素。
  • 流程:使用Node+ webdriverio,实现操作设备。
  • 语法:webdriverio 元素选择、模拟点击、滑动,获取元素属性 + 图片。

采坑:

  • 不同手机的开发者选项设置。
  • 启动参数务必加noReset。
  • 滑动事件务必加wait参数。
  • 键盘被隐藏,重新打开输入法即可。

最后,爬虫有风险,大家不要做违法违规的事,我是前端工程师秦少卫,不到之处恳请斧正,欢迎大家点赞关注评论,我们一起成长。

相关链接:

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
8天前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
35 0
|
2天前
|
前端开发 JavaScript
前端ES5 | js —添加元素方法
前端ES5 | js —添加元素方法
|
3天前
|
JavaScript 前端开发
前端JS函数
【9月更文挑战第4天】前端JS函数
15 6
|
6天前
|
开发者 图形学 开发工具
Unity编辑器神级扩展攻略:从批量操作到定制Inspector界面,手把手教你编写高效开发工具,解锁编辑器隐藏潜能
【8月更文挑战第31天】Unity是一款强大的游戏开发引擎,支持多平台发布与高度可定制的编辑器环境。通过自定义编辑器工具,开发者能显著提升工作效率。本文介绍如何使用C#脚本扩展Unity编辑器功能,包括批量调整游戏对象位置、创建自定义Inspector界面及项目统计窗口等实用工具,并提供具体示例代码。理解并应用这些技巧,可大幅优化开发流程,提高生产力。
26 1
|
6天前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
23 0
|
6天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
11 0
|
6天前
|
开发者 C# Android开发
明白吗?Xamarin与Native的终极对决:究竟哪种开发方式更适合您的项目需求,让我们一探究竟!
【8月更文挑战第31天】随着移动应用开发的普及,开发者面临多种技术选择。本文对比了跨平台解决方案Xamarin与原生开发方式的优势与劣势。Xamarin使用C#进行跨平台开发,代码复用率高,可大幅降低开发成本;但因基于抽象层,可能影响性能。原生开发则充分利用平台特性,提供最佳用户体验,但需维护多套代码库,增加工作量。开发者应根据项目需求、团队技能和预算综合考量,选择最适合的开发方式。
46 0
|
6天前
|
开发者 Android开发 iOS开发
Xamarin开发者的神器!揭秘你绝不能错过的插件和工具,让你的开发效率飞跃式提升
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程,保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用介绍 Xamarin.Forms 的基本功能和工作原理。首先配置 Visual Studio 开发环境,然后创建并运行一个包含标题、按钮和消息标签的示例应用,展示如何定义界面布局及处理按钮点击事件。这帮助开发者快速入门 Xamarin.Forms,提高跨平台应用开发效率。
19 0
|
6天前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
12 0
|
6天前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
26 0
下一篇
DDNS