- 简单介绍:airtest是用来模拟操作windos, android, ios机器进行自动化测试或者爬取数据,个人使用觉得还是蛮简单易用的,比appnium好用很多;
- 官方文档:airtest
- 提示 刚开始学习还是简易使用Airtest IDE进行上手操作,然后再使用poco进行代码编写
- 实例代码:
from airtest.core.api import *
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
from loguru import logger
class ScrapeFive(object):
'''
airtest 测试代码用例,后续可以依据这个进行改写
'''
def __init__(self, packgage_name, device_ip=None, total_number=100, **kwargs):
self.device_ip = device_ip
self.PACKAGE_NAME = packgage_name
self.TOTAL_NUMBER = total_number
self.scraed_titles = []
self.spare_dict = kwargs
self.connect_device()
def connect_device(self):
'''
链接设备
:return:
'''
if self.device_ip:
auto_setup(devices=[f'Android://127.0.0.1:5037/{self.device_ip}'])
dev = set_current(self.device_ip)
else:
auto_setup(devices=[f'Android:///'])
dev = None
self.poco = AndroidUiautomationPoco(device=dev, use_airtest_input=True, screenshot_each_action=False)
self.window_width, self.window_height = self.poco.get_screen_size()
stop_app(self.PACKAGE_NAME)
start_app(self.PACKAGE_NAME)
def scrape_index(self):
'''
查找元素
:return:
'''
elements = self.poco(f'{self.PACKAGE_NAME}:id/item')
elements.wait_for_appearance()
return elements
def scroll_up(self):
'''
滑动页面
:return:
'''
swipe((self.window_width*0.5, self.window_height*0.8), vector=[0, -1], duration=2)
def scrape_detail(self, element):
'''
详情页获取具体信息
:param element:页面元素对象
:return:具体获取的信息
'''
element.click()
panel = self.poco(f'{self.PACKAGE_NAME}:id/content')
panel.wait_for_appearance()
title = self.poco(f'{self.PACKAGE_NAME}:id/title').attr('text')
categories = self.poco(f'{self.PACKAGE_NAME}:id/categories_value').attr('text')
score = self.poco(f'{self.PACKAGE_NAME}:id/score_value').attr('text')
published_at = self.poco(f'{self.PACKAGE_NAME}:id/published_at_value').attr('text')
drama = self.poco(f'{self.PACKAGE_NAME}:id/drama_value').attr('text')
keyevent('BACK')
return {
'title': title,
'categories': categories,
'score': score,
'published_at': published_at,
'drama': drama
}
def main(self):
while len(self.scraed_titles) < self.TOTAL_NUMBER:
elements = self.scrape_index()
for element in elements:
element_title = element.offspring(f'{self.PACKAGE_NAME}:id/tv_title')
if not element_title.exists():
continue
title = element_title.attr('text')
logger.debug(f'get title{title}')
if title in self.scraed_titles:
continue
_, element_y = element.get_position()
if element_y > 0.8:
self.scroll_up()
element_data = self.scrape_detail(element)
logger.debug(f'scraped data {element_data}')
self.scraed_titles.append(title)
if __name__ == '__main__':
packgage_name = 'com.goldze.mvvmhabit'
device_ip = '127.0.0.1:5555'
device_ip = None
ScrapeFive(packgage_name, device_ip)