python爬虫二十二:使用weditor定位app控件(二)

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以及定位等操作(更加轻便,模拟多种状态,快速定位)
python爬虫二十二:使用weditor定位app控件(二)_第1张图片

2、定位控件

用u2连接手机(方法在上一篇)普通只能通过查找包名来定位现在可以通过weditor来定位更加方便和快捷
python爬虫二十二:使用weditor定位app控件(二)_第2张图片
text:全文本匹配
textContains:文本包含匹配(注意要唯一才能够操作)
textMatches:正则表达式匹配
textStartsWith:起始文本匹配
ClassName:如果有多个要根据索引值限定(注意层级关系)
classNameMatches:正则表达式匹配
resourceId:资源Id匹配如果有多个要根据索引值限定(注意层级关系)
resourceIdMatches:正则表达式(可能定位多个,用混合使用避免定位不到)
坐标点定位:在这里插入图片描述

python爬虫二十二:使用weditor定位app控件(二)_第3张图片

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()

你可能感兴趣的:(python爬虫学习)