例:在模拟器中自动刷 学习QG
- 环境配置
- java:安装jdk,配置环境变量(JAVA_HOME、CLASSPATH和path)
- python:直接安装anoconda,安装Appium-Python-Client包
2.2 chromedriver可能也是必要的,电脑已经配置过chromedriver,没有测试它的有无是否对app调试会有影响 - adb:安装Android Studio,配置环境变量(ANDROID_HOME和path【..Sdk\platform-tools】)
- appium:安装Appium
- 夜神:安装夜神模拟器,并用Android Studio里的adb.exe替换夜神的nox_adb.exe并更名(避免版本不兼容),安装app
- 网上都说要安装node.js,没有安装也能跑,就没安装了
- cmd调试
- Adb devices 查看是否连接上,连接上会显示deviceName(如127.0.0.1:62025)
- 获取app的package和主要activity(adb logcat -c;adb logcat ActivityManager:I *:s),一个app可能不止一个activity
2.1 打开需要测试的app,获取当前Activity(adb shell dumpsys activity activities | grep mFocusedActivity) - 查看模拟器中所有app(adb shell pm list packages -3【查看第三方包】)
- 运行Appium服务
- 打开软件后,填写主机地址(上一步1中可以看到地址)
- 开启服务,点击放大镜后配置后可以对app进行调试,一个可行的配置如下:
2.1 其中deviceName可以在上一步1中得到
2.2 pakage和activity可以在上一步中2得到
2.3 automationName,网上教程很多没有这一项,但是不加这一项程序会报错,没有找到合适的解决办法(可能是因为没有安装node.js导致无法初始化),因此加上了(这一项会改变将默认的uiautomator2)
2.4 noResst这一项避免每次打开app从头开始(如重新登陆)
{
"platformName": "Android",
"platformVersion": "7.1.2",
"deviceName": "127.0.0.1:62025",
"appPackage": "cn.xuexi.android",
"appActivity": "com.alibaba.android.rimet.biz.home.activity.HomeActivity",
"automationName": "UiAutomator1",
"noReset": "true"
}
- 配置好以后,就可以开始调试了(可以通过appium查看元素位置,进行xpath定位)
- UIAutomator2调试
- 笔者认为UIAutomator2比appium更好,但是该文主要聚焦于appium
- 除了用appium调试外,还可以用UIAutomator2直接调试,并且它可以通过网页直接看当前package和activity
- 安装
2.1 pip install uiautomator2,安装包
2.2 连接手机以后 python -m uiautomator2 init ,安装tool到手机
2.3 pip install weditor 安装调试工具 - 调试
3.1 python -m weditor 打开网页
3.2 用deviceName连接,连接后可逐步调试,xpath定位效果优于appium - 可以用UIAutomator2替代appium,但是网上多是appium,不确定UIAutomator2是否有明显的测试优势(网上有很多比较的文章)
4.1 uiautomator2操作比较简洁,配置也简单很多,连接手机可简单的完成,语言编写也较为简单
4.2 UIAutomator2的更多内容待探究
# 连接手机
import uiautomator2 as u2
d = u2.connect('deviceName') # adb devices显示的地址和端口
d.session('cn.xuexi.android') # 或者d.app_start(),启动应用
- 编写python程序(基于appium)
- caps中,newCommandTimeout是设置无动作自动退出时间,默认好像是60秒
- 以下代码一共写了四个函数,包括看文章的方式(每隔一段时间向下滑动一次),看文章的链接,看视频的方式(少于6min的视频,看完,否则只看6min),看视频的链接
- 每个动作都设置了sleep时间,不设置很可能会由于加载问题而出错,其余代码不做解释,详见注释
import time
# 需要保持appium服务在运行
from appium import webdriver
caps = {
"platformName": "Android",
"platformVersion": "7.1.2",
"deviceName": "127.0.0.1:62025",
"appPackage": "cn.xuexi.android",
"appActivity": "com.alibaba.android.rimet.biz.home.activity.HomeActivity",
"automationName": "UiAutomator1",
"noReset": "true",
"newCommandTimeout":"600"
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', caps)
# 看文章
# 文章阅读方式
def read(list,times): # 阅读driver链接列表,阅读时间10*(time+1)秒
for i in list:
i.click()
time.sleep(10)
for j in range(0,times):
driver.swipe(400,400,400,300,500) # swipe移动,向下滑
time.sleep(10)
driver.tap([(28, 50)]) # 阅读后返回
time.sleep(2)
def article(date_now,date_yesterday):
time.sleep(2)
articlelist0=driver.find_elements_by_xpath("//*[@text='%s']" % date_now) # 4个
print("文章:",articlelist0)
read(articlelist0,10) # 阅读
driver.find_element_by_xpath("//*[@text='要闻']").click()
time.sleep(2)
articlelist1=driver.find_elements_by_xpath("//*[@text='%s']" % date_yesterday)
print(articlelist1)
read(articlelist1,10) # 再阅读
time.sleep(2)
# 看视频 (联播频道5)
# 视频观看方式
def watch(list,times): # time*10秒
for i in list:
i.click()
time.sleep(10)
driver.find_element_by_xpath("//*[@text='点赞']").click() # 看的时候点个赞
k=0
while ("重新播放" not in driver.page_source): # 不出现“重新播放”,持续观看
k=k+1
time.sleep(10)
if k>times: # 大于time*10s,停止观看
break
driver.tap([(28, 50)]) # 返回
time.sleep(2)
def video(date_yesterday):
time.sleep(2)
driver.find_element_by_xpath("//*[@text='电视台']").click()
time.sleep(2)
driver.find_element_by_xpath("//*[@text='联播频道']").click()
time.sleep(2)
driver.swipe(400,400,400,300,500) # 能够获取更多的driver,说明app是不滑动不加载
videolist=driver.find_elements_by_xpath("//*[@text='%s']" % date_yesterday) # 点击当日视频,只获取了当前页面列表
print(videolist)
watch(videolist,36)
if __name__ == "__main__":
date_yesterday="2020-04-14"
date_now="2020-04-15"
article(date_now,date_yesterday)
video(date_yesterday)