uiautomator2+python3,实现手机解锁,以及软件登录

1安装的链接

  • 装uiautomator2
    pip install --upgrade uiautomator2
    pip install pillow
  • 部署守护进程
    python -m uiautomator2 init
  • 装weditor UI查看器
    pip install -U weditor
    运行python -m weditor   #确保手机连接电脑,会自动安装一个atx调试器
  • 备注:每次启动时运行python -m uiautomator2 init 和 python -m weditor就可以了
  • 通过wifi连
    要求设备IP和pc在同一网络中
    import uiautomator2 as u2
    d = u2.connect(‘设备ip’)
    print(d.info)
  • 通过usb连
    import uiautomator2 as u2
    d = u2.connect(‘设备序列号’)
    print(d.info)
  • u2.connect()不带参数调用,uiautomator2将从环境变量中获取设备ip(ANDROID_DEVICE_IP),如果此环境变量为空,则uiautomator将退回到connect_usb,需要保证只有一台设备连接到电脑

Uiautomator2基础_xia@xia的博客-CSDN博客

2.打开手机屏幕

#coding=utf8
import uiautomator2 as u2
import time
import os,re #可以不用
import logging
import paopao_login
logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(funcName)s - %(message)s')
logger = logging.getLogger(__name__)

d = u2.connect('MQS7N19423008360')
print(d.info)

def open():
    if d(resourceId="com.android.systemui:id/mask_top").exists:#获取屏幕锁屏的状态属性
        logger.info("处于锁屏状态")#打印处于锁屏状态
        d.screen_on()#把屏幕唤醒
        time.sleep(1)
        swipe()#调取滑动的函数
    else:
        print("当前非锁屏状态")  #当前非锁屏状态
        paopao_login.run_app() #启动app
def swipe():
    d.swipe_points([(452,2046), (0,375)], 0.05)#滑动屏幕
    logger.info("检测是否需要解锁图案锁")
    if d(resourceId="com.android.systemui:id/keyguard_fixed_length_pin_view").exists:#通过是否存在元素检测是否需要再次解锁   
        logger.info("需要解锁")
        d.click(851,1621)
        d.click(230,1644)
        d.click(521,1819)
        d.click(278,1392)
        d.click(521,1819)
        d.click(278,1392)
        time.sleep(1)
        if d(resourceId="com.huawei.android.totemweather:id/widget_time_hour").exists:#判断是否存在解锁后的页面上的元素
            logger.info("进入屏幕")
            paopao_login.run_app()
        else:
            logger.info("没有进入主屏幕")
            paopao_login.login_app()#如果已经在app里了。调用登录模块判断是否已经登录
    else:
        logger.info("解锁失败")
open()

3.编写登录模块

#coding=utf8
import uiautomator2 as u2
import time
import os,re #可以不用
import logging

logging.basicConfig(level = logging.INFO,format = '%(asctime)s - %(name)s - %(funcName)s - %(message)s')
logger = logging.getLogger(__name__)

d = u2.connect('MQS7N19423008360')#连接手机devices序列号
print(d.info)

def run_app():
    d.app_start("com.xx.android")#打开程序
    if d.session("com.xx.android", attach=True):#判断程序是否打开
        logger.info("已打开程序")
        login_app()
        if d(resourceId="com.xx.android:id/login").exists(timeout=5):#exists:等待元素出现
            logger.info("当前是登录页面")
            login_app()
        try:#如果不是登录页面,尝试从最开始滑动开始
            print("从授权开始")
            d(text="始终允许").click(timeout=1)
            d(text="始终允许").click(timeout=1)
            d(text="始终允许").click(timeout=1)
            d(text="始终允许").click(timeout=1)
            d(text="同意").click()
             #以上为同意权限
            d.xpath('//android.widget.FrameLayout[1]').swipe("left")
            d.xpath('//android.widget.FrameLayout[1]').swipe("left")
            d.xpath('//android.widget.FrameLayout[1]').swipe("left")
            d(resourceId="com.thinksns.sociax.android.nic:id/btn_login").click(timeout=1)
            #以上为滑动页面
            login_app()#滑动后进入登录页面调取登录框
        except Exception as e:#如果报错抛出报错
            print(e)
    else:
        logger.info("打开程序出错")    
        
def login_app():
    if d(resourceId="com.xx.android:id/email").exists:#判断登录框的元素是否存在
        d(resourceId="com.xx.android:id/email").set_text('xx')
        d(resourceId="com.xx.android:id/password").set_text('123456')
        try:
             d(resourceId="com.xx.android:id/login").click(timeout=10)#登录的时候等待10秒
        except Exception as e:
            print(e)
        if d(resourceId="com.xx.android:id/ntm_close"):#判断程序是否打开
            print("已找到弹出框")
        else:
            print("登录错误")
    else:
        logger.info("泡泡已经登录")#如果找不到元素,提示已经登录

4.非锁屏 登录的情况下运行的结果

<think>好的,用户想通过uiautomator2实现Android手机屏幕常亮。首先,我需要回忆一下Android中保持屏幕常亮的常见方法。通常,应用可以通过设置FLAG_KEEP_SCREEN_ON来防止屏幕休眠,但用户可能希望不依赖应用本身,而是通过自动化工具来实现。 接下来,考虑到用户使用的是uiautomator2,可能需要结合adb命令或者系统服务来操作。根据提供的引用,比如引用[4]提到通过adb操作亮屏和滑动解锁,引用[3]涉及svc命令,这可能与系统服务有关。另外,引用[1]中的代码使用了pressKeyCode和executeShellCommand,这可能模拟按键和执行脚本来保持唤醒。 可能的方案包括:1. 设置Wake Lock权限,但需要系统权限,普通应用可能无法使用。2. 调整系统设置,比如屏幕超时时间,但需要修改系统设置权限。3. 模拟用户操作,比如定期触摸屏幕,防止进入休眠。4. 使用adb命令调整亮度或发送唤醒信号。 然后,我需要检查这些方法的可行性。例如,调整屏幕超时可以通过settings put system screen_off_timeout,但需要adb权限。模拟触摸可以通过uiautomator2的swipe或click方法,定期执行。此外,执行shell脚本可能也是一个途径,如引用[1]中的wakeup.sh,但具体内容未知,可能需要编写自己的脚本。 还要注意不同Android版本可能有不同的限制,比如Android 10以上对后台执行限制更严格。因此,可能需要结合多种方法,比如设置屏幕超时为最大值,再配合模拟操作。同时,需要处理屏幕锁定后的解锁问题,可能需要使用swipe或输入密码,但涉及安全性的问题可能复杂。 最后,整合这些方法,给出具体的步骤和代码示例,确保用户能够理解和实施。需要测试这些方法的有效性,并提醒用户可能的权限需求和设备差异。</think>要通过`uiautomator2`实现Android手机屏幕常亮,可结合以下方案: ### 一、基础方案:设置屏幕超时时间 ```python import uiautomator2 as u2 d = u2.connect() # 设置屏幕超时为最大值(需系统权限) d.shell("settings put system screen_off_timeout 2147483647") # 立即唤醒屏幕 d.shell("input keyevent KEYCODE_WAKEUP") ``` *注意:需要`WRITE_SETTINGS`权限[^3][^4]* ### 二、增强方案:模拟用户操作 ```python import time import uiautomator2 as u2 def keep_screen_on(interval=30): d = u2.connect() while True: # 滑动屏幕保持唤醒(坐标需适配设备) d.swipe(500, 1500, 500, 500, 0.1) # 快速垂直滑动 # 或发送电源键信号 d.press("power") time.sleep(interval) # 建议后台线程运行 ``` ### 三、系统级方案(需root): ```python # 保持CPU唤醒 d.shell("echo temporary > /sys/power/wake_lock") # 设置最大亮度 d.shell("echo 255 > /sys/class/backlight/panel/brightness") ``` ### 四、组合方案推荐 1. 先设置最大超时时间 2. 配合每45秒微小滑动(避免影响UI) 3. 使用`FLAG_KEEP_SCREEN_ON`(若可控制应用层) ```python d.app_start("your.package.name") d.shell("am start -a android.settings.SETTINGS") # 进入设置界面增加活动状态 ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值