appium+Python 脚本编写

本贴最后更新于 1920 天前,其中的信息可能已经沧海桑田

两年前刚进公司的时候用过 appium,最后因换项目也就没再研究过了。就在前两个月一个通过阅读新闻赚钱的 App 让我意识到 也许 appium 可以这么干,哈哈。结果很不理想,这里就分享一下过程吧!

我选择的方案是 appium1.8.1 + 夜神模拟器 + Python 脚本

准备工作

安装夜神模拟器

安装过程就不说了,需要注意的是在环境变量添加 夜神模拟器 adb 的路径。
imagepng
然后启动模拟器,再打开命令行输入 adb devices

adb devices
List of devices attached
127.0.0.1:62001 device

imagepng

有设备列表就对了 62001 就是模拟器的端口,可以通过 adb 执行命令,appium 也是通过这个来连通设备的

安装 Appium

准备材料

Appium 国内下载地址
Appium 中文文档
Appium 各种资料 来自 testerhome

我安装的是 1.8.1 安装过程略过
配置环境变量

H:\soft\Appium\node_modules\.bin

imagepng

然后安装 nodejs ,配置 jdk,Android SDK ,Windows 下这些软件的安装过程都略过

Appium 原理

Appium 原理解析

Appium 启动参数

开始

下载趣头条 apk 文件,下载 apktool 工具其实就是一个 jar 包
将这两个文件放在同一个文件夹(自己视情况而定),在当前文件夹打开命令行,使用 apktool 反编译趣头条
imagepng

反编译命令

java -jar .\apktool_2.3.3.jar d .\qukan.apk

imagepng

完成后会多一个目录,用编辑器打开里面的 AndroidManifest.xml
要找的 Appium 启动 app 需要的两个参数 appPackage,appActivity

imagepng

imagepng

启动 Appium 服务

没什么特别的直接打开使用默认端口就行,如果被占用就改一下
imagepng

然后打开一个 inspector session
imagepng

界面如下
imagepng

输入启动参数,可以键值对,也可以直接编辑右边的 json 数据,我还是觉得 json 快一些

imagepng

启动后是这样的
imagepng

imagepng

这些功能用了选取元素。

下面是我之前做好的一下分析:

1:启动会出现红包挂件 --> 挂件信息 如下
Attribute	    Value
index	        0
class	        android.widget.LinearLayout
package	        com.jifen.qukan
content-desc	
checkable	    false
checked	        false
clickable	    false
enabled	        true
focusable	    false
focused	        false
scrollable	    false
long-clickable	false
password	    false
selected	    false
bounds	        [171,372][548,945]
resource-id	
instance	    0

判断 -> (如果有挂件){
    通过点击关闭红包挂件

}

关闭按键信息为:

Attribute	Value
index	        1
text	        先去逛逛
class	        android.widget.TextView
package	        com.jifen.qukan
content-desc	
checkable	    false
checked	        false
clickable	    true
enabled	        true
focusable	    false
focused	        false
scrollable	    false
long-clickable	false
password	    false
selected	    false
bounds	        [171,913][548,945]
resource-id	    com.jifen.qukan:id/a0d
instance	    5

2:开始读取文章列表

文章页面又分为两部分:
    第一部分 ---- 新闻分类:         资源:ID  com.jifen.qukan:id/qk -> class:android.widget.LinearLayout
                    分类标题:      对应为:[class	android.widget.TextView] 数组

    第二部分 ---- 主体内容:        resource-id	com.jifen.qukan:id/kt 
                    新闻列表:              [主体内容中子元素] -> com.jifen.qukan:id/uo

3,点击进入新闻页面:(判断有无红包挂件){    resource-id  com.jifen.qukan:id/a86
    有 则写上下滑动手势 获取金币
    }else{
        返回到列表,阅读下一个
    }

编写 python 脚本

安装 Appium-Python-Client

pip install Appium-Python-Client

下面是我写的脚本代码

from appium import webdriver
from time import sleep

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001 device'
desired_caps['appPackage'] = 'com.jifen.qukan'
desired_caps['appActivity'] = 'com.jifen.qkbase.view.activity.JumpActivity'
desired_caps['noReset'] = 'true'

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

def swipeUp(driver, t=500, n=1):
    '''向上滑动屏幕'''
  l = driver.get_window_size()
    x1 = l['width'] * 0.5 # x坐标
  y1 = l['height'] * 0.75 # 起始y坐标
  y2 = l['height'] * 0.25 # 终点y坐标
  for i in range(n):
        driver.swipe(x1, y1, x1, y2, t)

def swipeDown(driver, t=500, n=1):
    '''向下滑动屏幕'''
  l = driver.get_window_size()
    x1 = l['width'] * 0.5 # x坐标
  y1 = l['height'] * 0.25 # 起始y坐标
  y2 = l['height'] * 0.75 # 终点y坐标
  for i in range(n):
        driver.swipe(x1, y1, x1, y2,t)

def swipLeft(driver, t=500, n=1):
    '''向左滑动屏幕'''
  l = driver.get_window_size()
    x1 = l['width'] * 0.75
  y1 = l['height'] * 0.5
  x2 = l['width'] * 0.25
  for i in range(n):
        driver.swipe(x1, y1, x2, y1, t)

def swipRight(driver, t=500, n=1):
    '''向右滑动屏幕'''
  l = driver.get_window_size()
    x1 = l['width'] * 0.25
  y1 = l['height'] * 0.5
  x2 = l['width'] * 0.75
  for i in range(n):
        driver.swipe(x1, y1, x2, y1, t)

# 选择新闻
def selectNews(driver):
    news = []
    try:
        news = driver.find_element_by_id("com.jifen.qukan:id/kt").find_elements_by_xpath(
            "//*[@resource-id='com.jifen.qukan:id/uo']")
    except BaseException as e:
        swipeUp(driver,2000,1)
        news = selectNews(driver)
    return news
# 阅读新闻
def readNew(driver):
    news = selectNews(driver)
    for index,item1 in enumerate(news):
        print(item1.text)
        item1.click()
        # 等待页面加载
  sleep(3)
        # 检查是否是广告
  try:
            gbBtn = driver.find_elements_by_xpath("//android.widget.TextView[@text='关闭']")
            if (gbBtn):
                driver.keyevent(4)
        except BaseException as e:
            print(e)
        swipeUp(driver,6000,7)
        swipeDown(driver, 6000, 7)
        sleep(3)
        driver.keyevent(4)
        sleep(3)

# main
header = driver.find_element_by_id("com.jifen.qukan:id/qk").find_element_by_class_name("android.widget.LinearLayout")

list = header.find_elements_by_class_name("android.widget.TextView")

# 找到标题元素 循环点击
for index,item in enumerate(list):
    print(item.text)
    item = list[index+4]
    if(index==6):
        # 如果到了第六个滑动一下
  swipLeft(item,3)
    item.click()
    # 然后开始查找新闻列表
 # 阅读新闻函数 # 每个分类阅读的页数  pageNum = 0
  while(pageNum<10):
        readNew(driver)
        swipeUp(driver,2000,1)
        pageNum+=1
print(list)
driver.quit()

以上脚本运行就可以让新闻自动阅读啦。
记录备忘

  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    90 引用 • 383 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    536 引用 • 672 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...