浅谈如何使用Python控制手机(二)

目录
  • 1. 序言
  • 2. 前置工作
  • 3. 打开APP
  • 4. 获取APP的包名
  • 5. 打开特定页面
  • 6. 其它细节
  • 7. 总结

1. 序言

每年淘宝双十一的时候,总是要刷各种各样的浏览页面,收集能量或者喵币或者什么。

那既然如此,我就总想着,能否通过Python自动调用的方式来刷网页。

2. 前置工作

本文是基于使用Python控制手机(一),默认已经安装了ADB并配置了环境变量,安装了Python环境,且在Python中安装了uiautomator2和weditor等包。

3. 打开APP

当我们使用uiautomator2包来打开某个APP时,可以通过点击屏幕特殊位置的方式来实现。但是其中存在的问题便是,可能由于我们APP图标的移动,而使得程序无法运行。健壮性和通用性不高。

其实在uiautomator2这个包中,提供了一种可以通过APP包名就可以打开特定APP的方式,例如打开和关闭淘宝。

import uiautomator2 as u2
import time
d = u2.connect()  # 连接设备
d.app_start("com.taobao.taobao")  # 打开淘宝
time.sleep(10)  # 等待10秒钟
d.app_stop("com.taobao.taobao")  # 关闭淘宝

再比如打开和关闭微信:

import uiautomator2 as u2
import time
d = u2.connect()  # 连接设备
d.app_start("com.tencent.mm")  # 打开微信
time.sleep(10)  # 等待10秒钟
d.app_stop("com.tencent.mm")  # 关闭微信

4. 获取APP的包名

有的时候,我们是不太清楚一个APP的包名的,这时我们可以通过打印设备当前信息的方式来获取APP的包名。首先我们需要将要获取的APP打开,并且保持在手机最前台

执行代码:

import uiautomator2 as u2
import time
d = u2.connect()  # 连接设备
print(d.info)  # 打印设备信息

输出结果如下:

{'currentPackageName': 'com.taobao.taobao', 'displayHeight': 2111, 'displayRotation': 0, 'displaySizeDpX': 393, 'displaySizeDpY': 851, 'displayWidth': 1080, 'productName': 'cannon', 'screenOn': True, 'sdkInt': 29, 'naturalOrientation': True}
Process finished with exit code 0

在所打印的Json键值对中,键currentPackageName对应的值,即为此时正在最前台的APP的包名,上述结果操作时,正在最前的APP为淘宝。

5. 打开特定页面

一般来说,如果页面切换按钮含有特定文字,我们直接通过文字进行定位是最方便的,也是最准确的,比如打开微信朋友圈:

import uiautomator2 as u2
import time
d = u2.connect()  # 连接设备
d.app_start("com.tencent.mm")  # 打开微信
time.sleep(2)  # 等待2秒钟
d(text='发现').click()  # 点击文字为“发现”的控件
time.sleep(2)  # 等待2秒钟
d(text='朋友圈').click()  # 点击文字为“朋友圈”的控件

因为可能存在的,APP的加载时间和对点击操作的响应时间,尽量在每次点击操作之后,为APP和手机留有足够的反应时间。值得注意的是,如果打开微信之后,恰好有个常用联系人的昵称叫做“发现”,那就可能会被误点,这种情况下我们需要使用别的定位方式来定位特定控件。

需要点击的文字如果是固定的,就可以使用d(text="XXX")来选择控件元素,其中XXX为特定的文字。如果部分文字是固定的,比如第一次元素显示文字为“我是第11932位访客”,第二次显示文字为“我是第12111位访客”,那我们可以通过d(textContains="我是第").click()来点击这个控件,或者通过d(textContains="位访客").click()来点击这个控件,这种方式就可以通过子字符串来定位特定的元素控件。

还是使用进入朋友圈举例:

import uiautomator2 as u2
import time
d = u2.connect()  # 连接设备
d.app_start("com.tencent.mm")  # 打开微信
time.sleep(2)  # 等待2秒钟
# 点击“发现”,三选一
d(text='发现').click()  # 点击文字为“发现”控件
d(textContains='发').click()  # 点击带“发”的控件
# 通过WEditor获得的xpath定位
d.xpath('//*[@resource-id="com.tencent.mm:id/e8y"]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[3]/android.widget.LinearLayout[1]').click()
time.sleep(2)  # 等待2秒钟
# 点击“朋友圈”,三选一
d(text='朋友圈').click()  # 点击文字为“朋友圈”控件
d(textContains='朋').click()  # 点击带“朋”的控件
# 通过WEditor获得的xpath定位
d.xpath('//*[@resource-id="android:id/list"]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]/android.widget.LinearLayout[1]').click()

其实还有很多各不相同的定位方式,只要能定位到唯一的特定的控件进行点击即可。例如在双十一时,我在淘宝中切换到收集喵币页面的点击事件:

import uiautomator2 as u2
import time
d = u2.connect()  # 连接设备
d.app_start("com.taobao.taobao")  # 打开淘宝
time.sleep(5)  # 等待5秒钟
d.xpath('//*[@content-desc="双11超级喵糖"]').click()  # 打开喵糖页面

6. 其它细节

在双十一淘宝活动中,打开喵糖页面,会先弹出提示是否将此页面加入收藏的弹框,点击文字为“我再想想”的按钮。注意要判断此控件是否存在,点击不存在的控件将会报错。如果不确定一个控件是否存在,又不想判断的情况下,则需要使用 try......catch...... 来将其包裹。

if len(d(textContains='我再想想')) > 0:  # 如果存在此控件
    d(textContains='我再想想').click()  # 点击“我再想想”

点击“赚糖”控件,因为这个控件经常会被屏幕上出现的手指动画所挡住,因此需要等待:

while len(d(textContains='赚糖')) <= 0:
    time.sleep(1)
d(textContains='赚糖').click()

然后点击完后等会儿,再点击“去浏览”按钮:

while len(d(textContains='去浏览')) > 0:
    print("检测到浏览按钮...")
    d(textContains='去浏览').click()

等待15秒(算上反应时间,需要多等一会儿)返回即可:

d.press("back")  # 相当于手机返回键

7. 总结

其实具体的部分实现起来比较简单,在此总结一下uiautomator2 的其它一些功能。

关于按键:

d.press("home")         # 点击home键
d.press("back")         # 点击back键
d.press("left")         # 点击左键
d.press("right")        # 点击右键
d.press("up")           # 点击上键
d.press("down")         # 点击下键
d.press("center")       # 点击选中
d.press("menu")         # 点击menu按键
d.press("search")       # 点击搜索按键
d.press("enter")        # 点击enter键
d.press("delete")       # 点击删除按键
d.press("recent")       # 点击近期活动按键
d.press("volume_up")    # 音量+
d.press("volume_down")  # 音量-
d.press("volume_mute")  # 静音
d.press("camera")       # 相机
d.press("power")        # 电源键

关于锁屏与解锁:

# 一个设备信息字典中的布尔值,为true时代表当前屏幕亮起,为false代表当前屏幕熄灭
d.info.get('screenOn')
# 仅点亮屏幕
d.screen_on()
# 点亮屏幕并解锁,注意如果有密码,则只能进入密码输入页面,需要输入密码才能解锁
d.unlock()
# 关闭屏幕
d.screen_off()

关于点击等操作(支持百分比):

# 单击屏幕
d.click(x,y)  # x,y为点击坐标
# 双击屏幕
d.double_click(x, y)
d.double_click(x, y, 0.1)  # 默认两个单击之间间隔时间为0.1秒
# 长按
d.long_click(x, y)
d.long_click(x, y, 0.5)  # 长按0.5秒(默认)
# 滑动
d.swipe(sx, sy, ex, ey)
d.swipe(sx, sy, ex, ey, 0.5)  # 滑动0.5秒(默认)
#拖动
d.drag(sx, sy, ex, ey)
d.drag(sx, sy, ex, ey, 0.5)  # 拖动0.5秒(默认)
# 滑动点 多用于九宫格解锁,提前获取到每个点的相对坐标(这里支持百分比)
# 从点(x0, y0)滑到点(x1, y1)再滑到点(x2, y2)
# 两点之间的滑动速度是0.2秒
d.swipe((x0, y0), (x1, y1), (x2, y2), 0.2)
# 注意:单击,滑动,拖动操作支持百分比位置值。例:
d.long_click(0.5, 0.5) 表示长按屏幕中心

当然还有其它的一些功能,例如向上滑动屏幕,直到指定文字出现为止:

d(scrollable=True).scroll.to(text="3年级2班")

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python脚本利用adb进行手机控制的方法

    一.  adb 相关命令: 1. 关闭adb服务:adb kill-server 2. 启动adb服务  adb start-server 3. 查询当前运行的所有设备  adb devices 4. 可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行  -s 虚拟设备名称 5. 重启设备 adb reboot  --指定虚拟设备   adb -s 设备名称 reboot 6. 查看日志  adb logcat  清除日志 adb logcat -c 7. 进入linux shell下 

  • Python实现用手机监控远程控制电脑的方法

    一.前言 很多时候,我们都有远程控制电脑的需求.比如正在下载某样东西,需要让电脑在下载完后关机.或者你需要监控一个程序的运行状况等. 今天我们就来用Python实现一个远程监控并控制电脑的小程序. 二.实现原理 听起来远程控制电脑好像很高级的样子,但是实现起来其实非常简单.实现原理如下: 运行程序,让程序不停地读取邮件 用手机给电脑发送邮件 判断是否读取到指定主题的邮件,如果有,则获取邮件内容 根据邮件内容,执行预设的函数 与其说是学习如何远程控制电脑,还不如说是学习如何读取邮件.当然,上面的的

  • 教你用python控制安卓手机

    一.介绍 ADB(Android调试桥)是一个命令行工具(CLI),可用于控制Android设备并与之通信.您可以执行许多操作,例如安装应用程序,调试应用程序,查找隐藏的功能并使用外壳程序直接与设备连接.要启用ADB,您的设备必须首先解锁开发者选项并启用USB调试.要解锁开发人员选项,您可以转到设备设置,然后向下滚动到"关于"部分,找到设备上当前软件的内部版本号.单击内部版本号 7次,将启用开发人员选项.然后,您可以转到设置中的"开发人员选项"面板,然后从那里启用U

  • 浅谈如何使用Python控制手机(一)

    目录 1. 配置Python环境变量 2. 安装Python编辑器,并在其中配置Python 3. 安装控制包uiautomator2,和其它辅助包 4. 安装adb 5. adb调用 6.设备安装ATX 7. 编写Python代码进行控制手机 8. 更多使用方式 9. weditor调试工具 总结 1. 配置Python环境变量 Python环境变量安装较为简单,比较常用的方式是直接百度Anaconda并且下载安装,安装过程中可直接选择自动配置环境变量,在此不再赘述. 2. 安装Python编

  • python使用itchat实现手机控制电脑

    本文实例为大家分享了python使用itchat实现手机控制电脑的具体代码,供大家参考,具体内容如下 1.准备材料 首先电脑上需要安装了python,安装了opencv更好(非必需) 如果安装了opencv的话,在opencv的python目录下找到cv2.pyd,将该文件放到python的库搜索路径就可以导入了 然后下载itchat:github 2.开始使用 下载了itchat后解压(建议先阅读该文件夹下的docs),然后在该文件夹下执行cmd命令来安装itchat库: python set

  • python编程控制Android手机操作技巧示例

    目录 你应该拥有的东西 安装 开始 轻敲 截图 高级点击 TemplateMatching 滑动 打电话给某人 从手机下载文件到电脑 手机录屏 打开手机 发送 Whatsapp 消息 几天前我在考虑使用 python 从 whatsapp 发送消息.和你们一样,我开始潜伏在互联网上寻找一些解决方案并找到了关于twilio. 一开始,是一个不错的解决方案,但它不是免费的,我必须购买一个 twilio 电话号码.此外,我无法在互联网上找到任何可用的 whatsapp API.所以我放弃了使用 twi

  • 通过Python实现控制手机详解

    几天前我在考虑使用 python 从 whatsapp 发送消息.和你们一样,我开始潜伏在互联网上寻找一些解决方案并找到了关于twilio. 一开始,是一个不错的解决方案,但它不是免费的,我必须购买一个 twilio 电话号码.此外,我无法在互联网上找到任何可用的 whatsapp API.所以我放弃了使用 twilio 和任何其他 whatsapp API 的想法.在想了很多之,打开 android studio,我连接了我的手机,然后开始了这个过程.当应用程序构建时,我想到了使用手机本身自动

  • 浅谈如何使用Python控制手机(二)

    目录 1. 序言 2. 前置工作 3. 打开APP 4. 获取APP的包名 5. 打开特定页面 6. 其它细节 7. 总结 1. 序言 每年淘宝双十一的时候,总是要刷各种各样的浏览页面,收集能量或者喵币或者什么. 那既然如此,我就总想着,能否通过Python自动调用的方式来刷网页. 2. 前置工作 本文是基于使用Python控制手机(一),默认已经安装了ADB并配置了环境变量,安装了Python环境,且在Python中安装了uiautomator2和weditor等包. 3. 打开APP 当我们

  • 浅谈如何测试Python代码

    目录 一.介绍 二.测试范围 三.单元测试 四.第一个测试用例 五.异常测试 六.mounttab.py 七.测试覆盖率 八.总结 一.介绍 编写测试检验应用程序所有不同的功能.每一个测试集中在一个关注点上验证结果是不是期望的.定期执行测试确保应用程序按预期的工作.当测试覆盖很大的时候,通过运行测试你就有自信确保修改点和新增点不会影响应用程序. 知识点 单元测试概念 使用 unittest 模块 测试用例的编写 异常测试 测试覆盖率概念 使用 coverage 模块 二.测试范围 如果可能的话,

  • 浅谈c++调用python链接的问题及解决方法

    python 版本3.3 系统:windows 问题:链接时报告 1>pythonIniti.obj : error LNK2019: 无法解析的外部符号 __imp___Py_NegativeRefcount,该符号在函数 "public: __thiscall boost::python::api::object_base::~object_base(void)" (??1object_base@api@python@boost@@QAE@XZ) 中被引用 1>pyth

  • 浅谈如何使用python抓取网页中的动态数据实现

    我们经常会发现网页中的许多数据并不是写死在HTML中的,而是通过js动态载入的.所以也就引出了什么是动态数据的概念,动态数据在这里指的是网页中由Javascript动态生成的页面内容,是在页面加载到浏览器后动态生成的,而之前并没有的. 在编写爬虫进行网页数据抓取的时候,经常会遇到这种需要动态加载数据的HTML网页,如果还是直接从网页上抓取那么将无法获得任何数据. 今天,我们就在这里简单聊一聊如何用python来抓取页面中的JS动态加载的数据. 给出一个网页:豆瓣电影排行榜,其中的所有电影信息都是

  • 浅谈怎么给Python添加类型标注

    Python 添加类型标注 Python 如此简洁,书写者在声明变量时甚至无需考虑类型. 但是简洁与复杂间,是存在一个平衡点的.当我们书写较为复杂的项目时,还是希望可以拥有「静态类型语言」强大的类型检查和智能的提示. 好消息是,并不需要像 TypeScript 那样,引入一个新的编译器来给 JavaScript 做"升级"来进行类型检查, Python 自带的 typing 工具可以在一定程度上把 Python 变成「静态类型语言」:坏消息是, Python 归根结底不是「静态类型语言

  • 浅谈 IPv6 基本技术原理和特点二

    三.几种IPv6应用介绍    从语音.数据到视频,从对现有网络应用更卓越的支持与改善,到IPv6独具特色的创新业务,IPv6带给我们的全方位.高品质的应用与服务前景是美妙而广阔的.以下简单介绍几种IPv6的应用:  1. 视频应用    IPv6对于视频应用的意义在于:解决了地址容量问题,优化了地址结构以提高选路效率,提高了数据吞吐量,以适应视频通信大信息量传输的需要.IPv6还加强了组播功能,实现基于组播.具有网络性能保障的VC视频会议.高清晰度数字电视.VOD视频点播.网络视频监控应用.这

  • 浅谈php调用python文件

    关于PHP调用Python数据传输问题 这是以前大学时做项目出现的问题,现在把它挪上来,希望给遇到问题的未来大佬给出一些小的思路,请大佬们不要大意的帮我改正,如果出现问题或者有更好的解决方法,希望大家可以给出,谢谢! 以前小组开展项目实训,我们小组选择的是大数据分析,其中有一个用python进行文本分析之后对用户输入的数据进行分析,然后输出对应的岗位及其他.要求是前端将文本要求传到后台php,php调用python程序处理,再将数据传给php,然后再传到前端,进行下一步处理.结果python传回

随机推荐