1、weditor
1.1什么是weditor
定位app控件的一种工具,相当于selenium,可以快速定位app以及清晰的看到他们之间的层级关系,抓取app数据之前可以通过它先了解app的结构以及一些信息(就相当于饭前洗手虽然没有必要关联,但是有助于你的健康)它虽然对抓取app数据没太大相关,但可以帮助了解app的组成以及实现它的逻辑
1.2怎么使用weditor
①安装adb
②安装uiautomator2以及weditor
pip install --upgrade --pre uiautomator2
pip install weditor
③初始化移动端设备安装插件python -m uiautomator2 init
④连接手机(打开模拟器)DOS中输入adb devices
⑤DOS中输入输入weditor连接浏览器中就会弹出元素定位工具
具体操作可以参考我的上一篇文章
1.3weditor页面介绍
一共有四个区域:移动设备选取区域、控件属性区域、代码展示区域、层级关系和结果展示区域。有了这个定位工具就方便我们测试app以及定位等操作(更加轻便,模拟多种状态,快速定位)
2、定位控件
用u2连接手机(方法在上一篇)普通只能通过查找包名来定位现在可以通过weditor来定位更加方便和快捷
text:全文本匹配
textContains:文本包含匹配(注意要唯一才能够操作)
textMatches:正则表达式匹配
textStartsWith:起始文本匹配
ClassName:如果有多个要根据索引值限定(注意层级关系)
classNameMatches:正则表达式匹配
resourceId:资源Id匹配如果有多个要根据索引值限定(注意层级关系)
resourceIdMatches:正则表达式(可能定位多个,用混合使用避免定位不到)
坐标点定位:
import uiautomator as u2
import time
d = u2.connect_usb('127.0.0.1:62001')
d.app_start('com.baidu.searchbox') # 通过weditor更加快速定位,想开启谁去找就好了
time.sleep(2) # 防止页面跳转之后控件没有加载出来而造成找不到的情况
d(text="登录并进入百度APP").click(timeout=4) # 在weditor中找到text定位超过4秒就抛出异常
d(text="登录并进入百度APP").click_exists(timeout=4) # 判断text存不存在,不存在就直接跳过
print(d(text='登录并进入百度APP').exists)
d(textContains='并进').click()
d(textMatches='.{2}APP').click()
d(textStartsWith='登录并').click()
d(className='android.widget.TextView')[2].click()
d(className='android.widget.TextView', instance=2).click() # 跟上一种方法一样
d(classNameMatches='.\w{2}APP', text='登录并进入百度APP').click()
d(resourceId='com.baidu.searchbox:id/login')[0].click()
d(resourceId='com.baidu.searchbox:id/login', instance=0).click() # 跟上一种方法一样
d(resourceIdMatches='.*?\/login', text='登录并进入百度APP').click()
d(resourceId='com.baidu.searchbox:id/login', text=' 登录并进入百度APP').click() # 混合使用
# 混合定位之链式定位,不推荐使用
d(className='android.widget.TextView').child(text='登录并进入百度APP').click()
d(className='android.widget.TextView').child_by_text('登录并进入百度APP').click() # 意义同上定位控件
d.click(533, 687) # 将坐标点写入
3、解锁图案验证
常用
d.press('home') # home键
d.press('back') # 返回键
d.swipe_ext('left') # 往左滑动
d.swipe_ext('right') # 往右滑动
d.screen_off() # 熄屏
d.screen_on() # 亮屏
d.unlock() # 调出锁屏界面
通过坐标定位模拟人的行为给手机解锁(图案锁)
import uiautomator2 as u2
d = u2.connect_usb('127.0.0.1:62001')
d.swipe_points(points=[(10,20),(30,40),(40,50)],duration=0.2) # 将坐标点以列表方式传入,0.2毫秒延迟
4、模拟登录并操作考研帮
熟悉通过python操作app各种控件,模拟人的行为,为以后爬取app数据做铺垫
import uiautomator2 as u2
import time
class Kaoyanbang():
def __init__(self,serial='127.0.0.1:62001'):
# 通过usb来链接移动设备
self.d = u2.connect_usb(serial=serial)
self.size = self.get_windowsize()
self.handle_watcher()
# 定义监控器
def handle_watcher(self):
self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/tip_commit"]').click()
# 用户协议
self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/tv_skip"]').click()
# 广告窗口
self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/view_wemedia_cacel"]"]').click()
self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/kaoyan_home_schtip_close"]').click()
# 启动
self.d.watcher.start()
def get_windowsize(self):
# 获取手机屏幕的大小
return self.d.window_size()
def close_app(self):
# 监控器关闭
self.d.watcher.stop()
# 停止app
self.d.app_stop(package_name='com.tal.kaoyan')
# 清理缓存以备下一次使用
self.d.app_clear(package_name='com.tal.kaoyan')
def main(self):
# 启动考研帮app 并实现自动化操作
self.d.app_start(package_name='com.tal.kaoyan')
self.d(text='密码登录').click_exists(timeout=10)
# 找到相关控件后,通过set_text来输入文字
self.d(resourceId='com.tal.kaoyan:id/login_email_edittext').set_text('15575991096')
self.d(resourceId='com.tal.kaoyan:id/login_password_edittext').set_text('123456abc')
# 点击登录
# self.d(resourceId='com.tal.kaoyan:id/login_login_btn').click()
self.d(text='登录').click()
time.sleep(4) # 让页面有充分加载时间
if self.d.wait_activity('com.tal.kaoyan.ui.activity.HomeTabActivity', timeout=20):
self.d(text='研讯').click_exists(timeout=10)
# 获取到x轴的中心点
# 在获取到y轴的远方点和y轴的近点
x1 = int(self.size[0]*0.5)
y1 = int(self.size[1]*0.9)
y2 = int(self.size[1]*0.2)
while True:
# 获取安卓的吐司 toast
if self.d.toast.get_message(0) == '内容已经全部加载完了':
self.close_app()
return
# 以指定位置向上滑动
self.d.swipe(x1,y1,x1,y2)
if __name__ == '__main__':
k = Kaoyanbang()
k.main()