自动化篇 | 你想要的闲鱼日常操作,Python 给你实现了
2021-03-12 12:30
标签:click 下载链接 api rate index 调试 界面 content pack 前篇文章讲了如何在 iOS 端使用 Airtest 实现自动化的操作,本篇将继续带大家做 iOS 端的自动化项目。 如果你经常用闲鱼,应该每天都要进行下面操作,App 签到、鱼塘签到、擦亮宝贝,这一系列操作都是重复且枯燥的。 本篇文章的目的是利用 Python 实现 iOS 端闲鱼日常操作。 在编写脚本之前,我们需要利用 Mac OSX 的控制台程序拿到闲鱼 App 的 bundle。 第一步,打开目标 App。 利用应用程序的 bundle,使用 Poco API 可以非常方便地打开一个应用程序。 由于 冷启动 一个应用,经常会伴有广告界面,因此需要做一个显式等待,直到主界面加载完全。 第二步,应用签到。 使用 Airtest IDE 点击主页面的 App 签到入口,底部会展示出控件的属性列表。 然后,使用 name 属性值得到控件,执行点击操作,即可以来到签到页面。 查看签到按钮的时候,发现这个元素的 name 值为 StaticText,没有办法利用 name 属性值来确定控件元素,这里可以换用 value 属性来拿到控件元素,然后执行点击事件,完成签到。 签到成功之后,通过坐标点击右上角的返回键回到主页面。 第三步,擦亮宝贝。 首先,点击最后一个 Tab,进入到我的页面。利用 AirtestIDE 尝试去捕获元素,但是会报错:Select invalid payload,这个问题可能是 iOS-Tagent 现有的 Bug,这里换一种方式,使用点击屏幕坐标的方式跳转到商品发表页面。 第四步,鱼塘签到。 平常操作过程中,要实现点击界面上某个元素,有 2 种方式。 1、使用属性获取元素然后执行点击操作 2、使用 Poco API 对界面进行 截图,然后通过 PS 获取元素坐标,利用坐标执行点击操作。 进入到我加入的鱼塘界面后,通过元素层级关系拿到上面标识的文本元素,然后利用正则表达式计算出已经加入的鱼塘总数。 和 Android 端元素 UI 树布局方式不一样,iOS 的这个页面列表 Item 不能通过直接拿到列表控件遍历子元素获取。 iOS 端,只能拿到 Table 元素下所有的 StaticText 的元素,然后再通过属性值再进行一次过滤,得到每一个具体的鱼塘 Item。 通过观察,发现鱼塘签到界面有 2 种类型,即签到按钮的样式不一样、返回方式也不一样。签到界面内,签到按钮控件是一张图片元素,没法利用传统的文本方式获取控件。 这里可以通过 Airtest IDE 截取两种签到按钮的 局部图片 保存到本地,用 exists(Template(img_path)) 图片识别方法来判断元素是否存在,进而得到鱼塘是否已经签到。 如果元素存在,就代表鱼塘还未进行签到,利用返回元素的坐标执行点击操作,即可以完成鱼塘签到的操作。 通过上面的 4 步操作,就能实现 iOS 端闲鱼的一些基本操作。 需要注意的是,Poco 中包含的一些 API 在 Android、iOS 两端使用方式还存在一些差异,另外,iOS 平台在 Airtest IDE 中的 层级关系还不完全准确,需要自己进行手动调试修改。 我已经将全部源码上传到后台,关注公众号后回复「 基本操作 」即可获得下载链接。 如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。 iOS 自动化测试初探 这几个常用 alias,带你高效做事 THANDKS -End - 自动化篇 | 你想要的闲鱼日常操作,Python 给你实现了 标签:click 下载链接 api rate index 调试 界面 content pack 原文地址:https://blog.51cto.com/15023272/25588231
目 标 场 景
2
编 写 代 码
# 打开设备
home()
stop_app(package=self.package)
start_app(package=self.package, activity=None)
# 主页元素
element_home_tab1 = self.poco(‘闲鱼‘)
element_home_tab2 = self.poco(‘鱼塘‘)
element_home_tab3 = self.poco(‘消息‘)
element_home_tab4 = self.poco(‘我的‘)
element_home_tab5 = self.poco(‘发布‘)
self.poco.wait_for_all(
[element_home_tab1, element_home_tab2, element_home_tab3, element_home_tab4, element_home_tab5])
print(‘主页加载完全~‘)
# 点击进入到签到页面
self.poco(‘闲鱼币, 签到换好礼‘).click()
element_has_signed = self.poco(value=‘已签到‘)
if not element_has_signed:
self.poco(value=‘马上签到‘).click()
print(‘应用签到成功!‘)
self.poco.click([0.0703125, 0.06690140845070422])
接着,就可以循环滑动查找界面内所有文本内容为 擦亮 的按钮元素,然后执行点击操作,即可以完成擦亮宝贝的操作。# 由于界面元素没法获取,因此这里使用坐标点击
self.poco.click([0.1875, 0.36971831])
get_current_ui_tree(self.poco)
find_count = 0
# 查找擦亮元素
while True:
shine_btns = self.poco(‘Window‘).offspring("Table").offspring(name=‘StaticText‘, value=‘擦亮‘)
# 过滤隐藏的【擦亮按钮】
# shine_btns = shine_btns[1:]
if len(shine_btns) == 0:
break
else:
for shine_btn in shine_btns:
# 一个个宝贝去擦亮
print(‘点击一个商品‘)
shine_btn.click()
# 滑动到下一个页面
self.poco.swipe([0.5, 0.8], [0.5, 0.3], duration=1)
find_count += 1
print(‘全部宝贝都已擦亮~‘)
# 返回到主界面
self.poco(‘返回‘).click()
element_num = self.poco("Window").child("Other").child("Other").child("Other").child("Other").child("Other").child(
"Other")[
0].child("Other").child("Other").child("Other").child("Other").child("Other").child("Other").child(
"Other").offspring("ScrollView").child("Other").child("Other")[0].child("Other").child(
"Other").offspring("Table").child("Cell")[4].children()[0]
# 获取属性值
# 一共加入的鱼塘数目
fishpond_num = get_num_from_word(element_num.attr(‘value‘))[0]
print(f‘一共加入:{fishpond_num}个鱼塘‘)
while True:
element_static_texts = self.poco(‘Window‘).offspring("Table").offspring(name=‘StaticText‘)
for index, item in enumerate(element_static_texts):
item_content = item.attr(‘value‘)
if item_content == ‘进鱼塘‘:
print(f‘内容是:进入鱼塘按钮,进行处理!!!‘)
fishpond_body = element_static_texts[index - 1]
# print(fishpond_body.attr(‘value‘))
fishpond_body.click()
# 每个鱼塘进行签到
self.__fishpond_sign()
else:
pass
# print(f‘内容是:{item_content},不处理‘)
def element_is_exist(img_paths):
"""
元素是否准备
:return:
"""
result = None
for img_path in img_paths:
element_sign_position = exists(Template(img_path))
if element_sign_position:
result = element_sign_position
break
return result
# 签名元素
element_sign_position = element_is_exist([‘./image/ic_sign.png‘, ‘./image/ic_sign1.png‘])
if element_sign_position:
print(‘准备签到‘)
# 点击签到,注意使用相对比例坐标
print(element_sign_position[0] / self.size[0])
print(element_sign_position[1] / self.size[1])
self.poco.click([element_sign_position[0] / self.size[0], element_sign_position[1] / self.size[1]])
else:
print(‘鱼塘已经签到!‘)
3
结 果 结 论
推荐阅读:
文章标题:自动化篇 | 你想要的闲鱼日常操作,Python 给你实现了
文章链接:http://soscw.com/index.php/essay/63678.html