3. u2定位元素方法

2020-12-10  本文已影响0人  BeautifulSoulpy

3-1 u2自动化工具基本操作-操作设备

1. uiautomator2
import uiautomator2 as u2

import time

d = u2.connect_adb_wifi("192.168.0.100:5555")
# 查看状态
print(d.service("uiautomator").running())
# 启动服务
d.service("uiautomator").start()
time.sleep(2)
print(d.service("uiautomator").running())

#停止状态
d.service("uiautomator").stop()
time.sleep(2)
print(d.service("uiautomator").running())
#-------------------------------------------
already connected to 192.168.0.100:5555
True
True
False
2. ATX-agent

如果ATX-agent停止,可以通过connnect来唤醒ATX-agent

import uiautomator2 as u2

import time

d = u2.connect_adb_wifi("192.168.0.100:5555")
# 查看ATX-agent运行状态;如果停,可以通过connnect来唤醒ATX-agent
print(d.agent_alive)
# -------------------------------------------
True


# 查看设备信息
print(d.device_info)
# 查看设备的分辨率
print(d.window_size())
# 查看获取的wifi地址
print(d.wlan_ip)          # 模拟器与真机不一致;
#-------------------------------------------------
{'udid': 'android-08:00:27:e9:1b:52-AOSP_on_Shama', 'version': '5.1.1', 'serial': 'android', 'brand': 'Android', 'model': 'AOSP on Shama', 'hwaddr': '08:00:27:e9:1b:52', 'port': 7912, 'sdk': 22, 'agentVersion': '0.9.5', 'display': {'width': 1080, 'height': 1920}, 'battery': {'acPowered': False, 'usbPowered': True, 'wirelessPowered': False, 'status': 2, 'health': 2, 'present': True, 'level': 87, 'scale': 100, 'voltage': 4, 'temperature': 26, 'technology': 'Li-ion'}, 'memory': {'total': 3110960, 'around': '3 GB'}, 'arch': '', 'owner': None, 'presenceChangedAt': '0001-01-01T00:00:00Z', 'usingBeganAt': '0001-01-01T00:00:00Z', 'product': None, 'provider': None}
(1080, 1920)
172.16.70.15

3-2 u2自动化工具基本操作-操作app

1. 安装apk与启动
# 1. url安装
import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
# 通过 app_install, urll= 'XXX.apk'
d.app_install(url="http://file.mukewang.com/apk/app/124/1606182011/imooc_7.4.4_10102001_android.apk")
# ------------------------------------
[D 201210 11:03:58 __init__:1291] pm install -rt /data/local/tmp/_tmp.apk


aapt dump badging imooc_7.4.4_10102001_android.apk
package: name='cn.com.open.mooc' versionCode='7440' versionName='7.4.4' platformBuildVersionName=''


# 启动app
d.app_start(package_name="cn.com.open.mooc")

print(d.app_current())   # 获取当前前台运行的app信息;
#--------------------------------
{'package': 'cn.com.open.mooc', 'activity': 'cn.com.open.mooc.component.user.activity.login.LoginActivity'}

# 停止 app ;
d.app_stop(package_name="cn.com.open.mooc")

# 获取app详细信息
print(d.app_info(package_name="cn.com.open.mooc"))
#--------------------------------
{'packageName': 'cn.com.open.mooc', 'mainActivity': 'com.imooc.component.imoocmain.splash.MCSplashActivity', 'label': '慕课网', 'versionName': '7.4.4', 'versionCode': 7440, 'size': 35948349}

# 清除app缓存
d.app_clear("cn.com.open.mooc")

# 卸载APP
d.app_uninstall("cn.com.open.mooc")

# 所有app_list
print(d.app_list())

# 在运行的app列表
print(d.app_list_running())

# 停止所有运行程序
d.app_stop_all()

# 卸载所有第三方的app;
d.app_uninstall_all() 

3-3 APP activity和控件,weditor工具的安装

滑动、点击操作

1. activity和控件
activity相当于页面
控件

Android基础--------Android常用控件介绍及使用
https://blog.csdn.net/weixin_38423829/article/details/80566203

2. weditor工具的安装

3-4 weditor工具介绍和常见问题-1

启动
weditor
listening on http://192.168.0.103:17310

最重要的几步

1. 连接设备

有绿叶标志表示连接成功;

2. 开启 ATX启动

注意:1. 必须保证ATX-agent是启动的;

# 查看ATX启动状态1
import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
print(d.agent_alive)   # True


查看ATX启动状态2

# 查看ATX启动状态2

2. Linux下开启 ATX启动

ATX启动

3-5 weditor工具介绍和常见问题-2

不同的手机有不同的现象,

1. 关闭后台冻结和自动优化

2. 开启自启动

3-6 UiSelector和控件定位介绍

两种定位方法


1. UiSelector 介绍
布局 线性布局
帧布局 线性布局
绝对布局

控件

控件

3-7 UiSelector文本定位方式

1. 文本定位四种方法
1. text全文匹配
import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名

d.app_start(package_name='com.android.settings')
d(text="蓝牙").click()


2. 文本包含
d.app_start(package_name='com.android.settings')
d(textContains="通知").click()

3. 正则表达式
d.app_start(package_name='com.android.settings')
# d(textContains="通知").click()
d(textMatches=".{4}通知").click()
4. 起始文本
d.app_start(package_name='com.android.settings')
# d(textContains="通知").click()
# d(textMatches=".{4}通知").click()
d(textStartsWith="日期").click()
2. 描述信息定位
描述信息

3-8 UiSelector className定位方式

1. 两种定位方式
className定位方式 蓝牙控件查找 Hieratchy控件查找
className

需要注意层级关系

import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名

d.app_start(package_name='com.android.settings')
d(className="android.widget.LinearLayout")[2].click()

classNameMatches
d.app_start(package_name='com.android.settings')
d(classNameMatches="android\.widget\.\w{12}", text="蓝牙")[2].click()

3-10 UiSelector resourceId定位方式

混合定位的方式

1. 通过资源ID来定位控件

resourceId(推荐使用)
通过资源ID来定位控件,通过索引来进行限定

import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名

d.app_start(package_name='com.android.settings')
d(resourceId="com.android.settings:id/icon")[1].click()

# 通过实例来查找, 值 和 索引 是一样的
d.app_start(package_name='com.android.settings')
d(resourceId="com.android.settings:id/icon", instance=2).click()

# 通过其他条件进行限定;
d.app_start(package_name='com.android.settings')
d(resourceId="com.android.settings:id/icon", text="蓝牙").click()

resourceIdMatches

d.app_start(package_name='com.android.settings')
d(resourceIdMatches="com.android.settings:id\/\w{4}")[1].click()

3-11 UiSelector混合定位方式-1

层级关系
1. 链式资源定位方式

先定位上级标签,

import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名

d.app_start(package_name="com.android.settings")
d(className="android.view.View").child(text="蓝牙").click()


3-12 UiSelector混合定位方式-2
链式定位层级关系:几种定位方式可以混合;

d(className="android.widget.ListView").child(resourceId="oppo:id/oppo_preference")[2].click()

3-13 UiSelector 坐标定位方式

坐标点的展示方式 有两种:

  1. 原始坐标;
  2. 百分比坐标点
百分比坐标点定位
d.app_start(package_name="com.android.settings")
d.click(0.164, 0.248)

3-14 控件操作和操作超时

控件不存在时的异常处理机制
在5s内没有点击控件 抛出异常

# 在5s内没有点击控件 抛出异常
d.app_start(package_name="com.android.settings")
d(text="蓝牙").click(timeout=5)

# 在5s内没有点击控件 不抛出异常
d(text="蓝牙1").click_exists(timeout=5)

# 是否存在 属性
d.app_start(package_name="com.android.settings")
print(d(text="蓝牙1").exists)

print(d(text="蓝牙1").exists(timeout=5))

# 显示有多少个子节点;
d(resourceId="android:id/llist").count

3-15 通过U2实现移动设备九宫格解锁

1. 滑动解锁九宫格

手机基本操作

# 滑动解锁九宫格

d.screen_off()   # 熄灭
d.screen_on()    # 点亮屏幕

d.unlock()  # 点亮
print(d.info.get("screenOn")) # 查看屏幕状态

返回
# 点home
d.press("home")
# 返回
d.press("back")

左右滑
import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
d.swipe_ext("left")

3-16 Xpath 和 Xpath定位方式

1. Xpath常用语法
Xpath定位
import uiautomator2 as u2

d = u2.connect_wifi("192.168.0.100")
# with open("./phone.file", 'w', encoding="utf-8") as f:
#     f.write(d.dump_hierarchy())           # 写资源

d.xpath('//*[@text="蓝牙"]').click() 

2. 总结

3-17 实现自动化登录考研帮app并滑动资讯信息-1

实现代码


import uiautomator2 as u2

class HandleKaoyanbang(object):
    def __init__(self, serial="192.168.0.100"):
        self.d = u2.connect(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()

        # 监控器要 start启动
        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("com.tal.kaoyan")
        # 清理缓存
        self.d.app_clear("com.tal.kaoyan")

    def handle_kaoyanbang_app(self):
        self.d.app_start(package_name="com.tal.kaoyan")
        self.d(text='密码登录').click_exists(timeout=10)
        self.d(text="手机号/用户名/通行证").set_text('18326602330')
        self.d.xpath('//*[@resource-id="com.tal.kaoyan:id/kylogin_unamelogin_operate_layout"]/android.widget.RelativeLayout[1]').set_text('*********')
        self.d(resourceId="com.tal.kaoyan:id/login_login_btn").click_exists()

        if self.d.wait_activity("com.tal.kaoyan.ui.activity.HomeTabActivity",timeout=10):
            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.15)
            while True:
                # get toast 信息提示操作;
                if self.d.toast.get_message(0) == "内容已经全部加载完了":
                    self.close_app()
                    return

                # 开始滑动研讯
                self.d.swipe(x1, y1, x1, y2)


if __name__ == '__main__':
    k = HandleKaoyanbang()
    k.handle_kaoyanbang_app()


上一篇下一篇

猜你喜欢

热点阅读