Python + Appium 自动化操作微信入门

news2024/11/26 4:46:47

Appium 是一个开源的自动化测试工具,支持 Android、iOS 平台上的原生应用,支持 Java、Python、PHP 等多种语言。

Appium 封装了 Selenium,能够为用户提供所有常见的 JSON 格式的 Selenium 命令以及额外的移动设备相关的控制命令,比如:多点触控手势、屏幕朝向等。

现在先下载需要软件。

JDK下载地址

配置环境变量:

计算机(右键)->属性->高级系统设置->高级->环境变量->新建环境变量 JAVA_HOME,如图所示:
在这里插入图片描述
系统变量->找到 Path 变量->编辑->在变量值的末尾添加;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

新建 CLASSPATH 变量,变量值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

android-sdk下载地址
配置环境变量:

与 JDK 配置类似,新建环境变量 ANDROID_HOME,变量值为 android-sdk 位置,比如:D:\android-sdk-windows

在 Path 变量值的末尾添加 ;%ANDROID_HOME%\tools;%ANDROID_HOME%\build-tools\30.0.0-preview;%ANDROID_HOME%\platform-tools
Appium下载地址
安装 Python 库:pip install appium-python-client

Appium 安装完成启动后,点击编辑配置,配置 JDK 和 android-sdk,如图所示:
在这里插入图片描述
mumu下载地址
mumu 模拟器下载完后,除了根据自己需要更改一下安装路径,其他选项默认即可安装,装完后打开点击应用中心,搜一下微信,搜到之后安装一下,微信安装完成后再用自己的微信号登录一下。

因为我们是通过安卓的 adb 连接虚拟机的,因此需要在控制台执行 adb connect 127.0.0.1:7555 命令,让 adb 连接上虚拟机。

执行了上面连接模拟器的命令后,我们可以在 cmd 控制台输入 adb devices 查看当前连接的虚拟机。

接下来就开始我们的操作:
首先启动 Appium 和 mumu,因为之前我们已经配置了 Appium,此时我们直接点击 Appium 的启动服务器按钮即可,如下图所示:
在这里插入图片描述
启动之后如图所示:
在这里插入图片描述
现在我们可以先通过 Python 来启动一下微信,代码实现如下:

desired_caps = {
        "platformName": "Android",  # 操作系统
        "deviceName": "emulator-5554",  # 设备 ID
        "platformVersion": "6.0.1",  # 设备版本号
        "appPackage": "com.tencent.mm",  # app 包名
        "appActivity": "com.tencent.mm.ui.LauncherUI",  # app 启动时主 Activity
        'noReset': True,  # 是否保留 session 信息,可以避免重新登录
        'unicodeKeyboard': True,  # 使用 unicodeKeyboard 的编码方式来发送字符串
        'resetKeyboard': True  # 将键盘给隐藏起来
    }
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)

执行上述代码之后,如果发现 mumu 模拟器中的微信已经启动了,就说明基本环境已经调通了;如果执行代码后发现调不到 mumu 模拟器中的微信,先在 cmd 中执行一下 adb connect 127.0.0.1:7555 命令,再执行程序即可。
添加好友
我们先来使用 Appium 实现添加好友的操作,基本过程为:打开微信->点击⊕->选择添加朋友->在搜索框输入微信号->点击搜索->点击添加到通讯录,功能的代码实现如下:

desired_caps = {
        "platformName": "Android",  # 操作系统
        "deviceName": "emulator-5554",  # 设备 ID
        "platformVersion": "6.0.1",  # 设备版本号
        "appPackage": "com.tencent.mm",  # app 包名
        "appActivity": "com.tencent.mm.ui.LauncherUI",  # app 启动时主 Activity
        'noReset': True,  # 是否保留 session 信息,可以避免重新登录
        'unicodeKeyboard': True,  # 使用 unicodeKeyboard 的编码方式来发送字符串
        'resetKeyboard': True  # 将键盘给隐藏起来
    }
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(10)
print('点击+号')
driver.find_element_by_id('com.tencent.mm:id/ef9').click()
time.sleep(5)
print('选择添加朋友')
driver.find_elements_by_id('com.tencent.mm:id/gam')[1].click()
time.sleep(5)
print('点击搜索框')
driver.find_element_by_id('com.tencent.mm:id/fcn').click()
time.sleep(5)
print('在搜索框输入微信号')
driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys('ityard')
time.sleep(3)
print('点击搜索')
driver.find_element_by_id('com.tencent.mm:id/ga1').click()
time.sleep(3)
print('点击添加到通讯录')
driver.find_element_by_id('com.tencent.mm:id/g6f').click()

简单说一下,在代码中我们通过 driver.find_element_by_id(‘com.tencent.mm:id/xx’) 来获取微信上的元素,如果有重复的,则可以使用 driver.find_elements_by_id(‘com.tencent.mm:id/xx’)[n] 来取,通过 send_keys(‘xx’) 实现信息的输入,通过 click() 实现点击操作。

上面我们说了通过 find_element(s)_by_id(‘com.tencent.mm:id/xx’) 来获取元素,那么如何来确定 xx 呢?下面来一起看一下。

首先我们点击 Appium 中的放大镜位置,如下图所示:
在这里插入图片描述
点击之后会进到如下界面:
在这里插入图片描述
我们在图中所需功能下方将代码中的 desired_caps 信息配置进去,配置好后点击启动会话按钮,启动之后我们会发现 Appium 中与 mumu 中的微信效果不一致,如下图所示:
在这里插入图片描述
此时只需点击一下上图中红框圈起来的刷新按钮即可,现在我们就可以确定元素的值了(也就是上面说的 xx),比如:我们来确定微信中添加位置 ⊕ 的值,用鼠标点击 ⊕ 即可查看,如下图所示:
在这里插入图片描述
我们接着点击 ⊕,操作步骤为:先到 mumu 模拟器中点击微信中的 ⊕,如下图所示:
在这里插入图片描述
点击之后再到 Appium 中点击刷新按钮,如下图所示:
在这里插入图片描述
从图中我们可以看列表中每个选项的值都是 com.tencent.mm:id/gam,此时代码中我们就是用的 driver.find_elements_by_id(‘com.tencent.mm:id/gam’)[1] 来取的,通过上面的介绍相信大家对 Appium 的使用已经基本了解了。
发送消息
发送消息我们模拟的基本流程是:打开微信->点击搜索的放大镜->在搜索框输入好友昵称->点击搜索到的好友->发送文字+表情,代码实现如下:

desired_caps = {
        "platformName": "Android",  # 操作系统
        "deviceName": "emulator-5554",  # 设备 ID
        "platformVersion": "6.0.1",  # 设备版本号
        "appPackage": "com.tencent.mm",  # app 包名
        "appActivity": "com.tencent.mm.ui.LauncherUI",  # app 启动时主 Activity
        'noReset': True,  # 是否保留 session 信息,可以避免重新登录
        'unicodeKeyboard': True,  # 使用 unicodeKeyboard 的编码方式来发送字符串
        'resetKeyboard': True  # 将键盘给隐藏起来
    }
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
time.sleep(10)
print('点击微信搜索框')
driver.find_element_by_id('com.tencent.mm:id/f8y').click()
time.sleep(10)
print('在搜索框输入搜索信息')
driver.find_element_by_id('com.tencent.mm:id/bhn').send_keys('Python小二')
time.sleep(3)
print('点击搜索到的好友')
driver.find_element_by_id('com.tencent.mm:id/tm').click()
time.sleep(3)
# 输入文字
driver.find_element_by_id('com.tencent.mm:id/al_').send_keys('hello')
time.sleep(3)
# 输入表情
driver.find_element_by_id('com.tencent.mm:id/anz').click()
time.sleep(3)
driver.find_element_by_id('com.tencent.mm:id/rv').click()
# 点击发送按钮发送信息
driver.find_element_by_id('com.tencent.mm:id/anv').click()
# 退出
driver.quit()

因模拟器反应可能会慢一些,如果程序执行时出错,可以将中间的等待时间 time.sleep(x) 设置大一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153954.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟化技术

虚拟化 虚拟化技术 目前虚拟化技术有软件模拟、全虚拟化(使用二进制翻译)、半虚拟化(操作系统辅助)、硬件辅助虚拟化和容器虚拟化这几种。 (1)软件虚拟化 软件模拟是通过软件完全模拟cpu、芯片组、磁盘、…

Spring Cloud Gateway 远程代码执行漏洞(CVE-2022-22947)

参考链接:https://blog.csdn.net/xiaobai_20190815/article/details/124045768 http://news.558idc.com/290335.html Java 安全-手把手教你SPEL表达式注入_4ct10n的博客-CSDN博客_spel注入 一、漏洞描述 Spring Cloud Gateway 是基于 Spring Framework 和 Spring…

组学新品|“4K”微生态之肠道菌群深度宏基因组

1.“4K”微生态定义 人体微生物群是人体内部与体表所有微生物有机体的总称[1],其组成包括非细胞结构的病毒(包括噬菌体)、原核生物中的真细菌和古细菌,以及真核细胞微生物。与之对应,微生物群可以分为病毒群、细菌群、…

Redis未授权访问漏洞(二)Webshell提权篇

前言 在学习这篇文章之前,请先通过这篇文章Redis未授权访问漏洞(一)先导篇学习一下基础知识,再来学习这篇文章。 webshell提权 环境准备 攻击机: Centos7 IP:192.168.44.130 靶机:Centos7 IP:192.168.44.129 首先我们需要准备好…

QuartzNet的基本使用,Scheduler,Job,Trigger的应用

Quartz.Net的基本使用方法 Quartz.Net的基本使用是比较简单的,主要是对下面三个工具的创建和使用。 Scheduler调度器Job执行的动作Trigger触发器 Scheduler的创建和使用 scheduler的创建有几种不同的方式,但一般可以直接使用其提供的工厂类直接创建 通过工厂类…

分享92个NET源码,总有一款适合您

NET源码 分享92个NET源码,总有一款适合您 92个NET源码下载链接:https://pan.baidu.com/s/1Ya4GMXuHhNbqkLU5b7SPEw?pwd5vpx 提取码:5vpx 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...&…

【指针面试题】-还在为学过指针的理论只是不会实践吗??赶紧来看看这里讲解了许多指针的面试题,带你更好掌握指针!!!

🎇作者:小树苗渴望变成参天大树 🧨作者宣言:认真写好每一篇博客 🎊作者gitee:link 🎉指针笔试题详解💥前言💦一、指针和数组面试题解析💨1.1一维数组💢1.2字…

Episode 01 密码技术基础

一、加密和解密&&发送者、接收者和窃听者 发送者:发出消息的人 接收者:接收消息的人 窃听者:恶意获取消息的第三方 加密:发送者将明文转换为密文 解密:接收者将密文还原为明文 破译:接收者以外…

客流统计系统为什么深受门店商户的喜爱?

人数或人群流动信息进行精确的统计分析,而且还可以利用这些高精度的数据,还能获得该区域精确的客流量信息,实现有效合理的组织运营工作,提升工作效益,帮助使用者开展更有成效的组织工作。客流统计系统内置高性能CMOS图…

同源跨域的概念与实现跨域的几种方案

本文将结合周老师的讲义对同源与跨域这一前端经典问题进行系统的总结、整理。一起来坐牢,快! 1. 同源限制 1.1 历史背景 - 含义的转变 1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。 最初&…

【无标题】javaEE初阶---多线程(面试常用)

这篇文章 , 我将主要介绍多线程进阶部分的内容 . 主要涉及到一些在面试中常考的内容。 一:常见的锁策略 1.1乐观锁和悲观锁 乐观锁 : 预测接下来发生锁冲突的可能性不大 , 而进行的一类操作; 悲观锁 : 预测接下来发生锁冲突的可能性很大 , 而进行的一类操作.乐观锁 : 假设数…

ClassIn:如何打造更稳定的Zabbix监控系统

作者简介:罗呈祥。现就职于北京翼鸥教育科技有限公司,负责数据库相关的运维管理和技术支持工作,擅长故障处理和性能优化,对分布式数据库也有深入研究。 近期,OceanBase 社区发布了一篇关于我们公司选型分布式数据库的文…

bilateral_filter 双边滤波器详细用法

一、双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。其输出像素的值依赖于邻域像素的值的加权组合。 从效果来说,双边滤波可产生类似美肤的效果。皮肤上的皱纹和斑,与正常皮肤的差异,远小于黑白眼珠之间的差异…

13种Shell逻辑与算术,能写出5种算你赢!

相较于最初的 Bourne shell,现代 bash 版本的最大改进之一体现在算术方面。早期的 shell 版本没有内建的算术功能,哪怕是给变量加1,也得调用单独的程序来完成。 1、算术方法一: $(( )) 只要都是整数运算,就可以在 $(…

DHT11温湿度传感器初识

目录 一、产品概述 1、接线方式 2、特点 3、数据传送逻辑 二、发送时序检测模块是否存在 1、C51单片机(主机)时序分析 2、编写代码检测模块是否存在 3、读取DHT11数据的时序分析 三、温湿度通过串口传到PC显示 四、温湿度检测小系统——使数据…

Discrete Opinion Tree Induction for Aspect-based Sentiment Analysis 论文阅读笔记

一、作者 Chenhua Chen、Zhiyang Teng、Zhongqing Wang、Yue Zhang School of Engineering, Westlake University, China Institute of Advanced Technology, Westlake Institute for Advanced Study Soochow University 二、背景 如何为每一个方面词定位相应的意见上下文…

反补码运算之 “1 - 1 = - 1 ” ?

我们在研究数据的二进制表示时遇到这样一个问题: 由于计算中的CPU只有加法器,没有减法器,所以在计算机采用原码做减法时对于:1 - 1 0 相当于1 (-1),用二进制表示为:000110011001。…

儿童感染新冠病毒后发高烧如何应对?专家来支招

儿童感染新冠病毒后发热较多,但肺炎发展较少儿童感染新冠病毒后发高烧,是重症吗?徐红梅:从目前的接待情况来看,儿童感染新冠病毒后比成人发烧。超过一半的儿童在感染后有发烧症状,伴有咳嗽、鼻塞、流鼻涕、…

JavaWeb的一些学习总结

Web系统就是:前端负责貌美如花,后端负责坚如磐石 企业在做Web系统时,成本与收益的对比是不可忽视的,企业做项目一定是要盈利的! 企业做项目最求的不是技术的新和潮,追求的是低成本和稳还有好用度&#xff…

函数的设计

一、默认参数 C允许在函数定义或声明时,为形参指定默认值,即默认参数(default argument)。 (1)函数定义与函数声明只能设置一次默认参数。 (2)可以设置多个默认参数,设…