事情的起因是在学习Appium自动化测试过程中,使用Appium无法对B站的登录界面进行操作
也无法调用其信息。网上给出的解释是B站处于安全防护考虑,做了限制。限制有点厉害,使用特殊方法才截的屏。
以下是截图应用的控件坐标。
1、设备为小米10s,分辨率为1080x2340 屏幕密度440
查看屏幕信息adb命令:
adb shell wm size # 屏幕分辨率
adb shell wm size 540×960 # 设置屏幕分辨率
adb shell wm density # 屏幕密度
adb shell wm density 100 # 设置屏幕密度
adb shell wm size reset # 重置屏幕尺寸大小
adb shell wm density reset # 重置屏幕密度
adb shell dumpsys window displays # 屏幕通用信息
2、使用Appium 对界面对登录界面进行捕获
结果就是捕获不到这个界面
3、使用ADB命令通过坐标进行点击、输入等操作
adb shell input tap 290 710 # 点击屏幕290 710坐标
adb shell input text 11111111111 # 输入文本,以手机号为例
4、以Python 代码实现登录操作
from appium import webdriver
import os, time
os.system('chcp 65001') # 将cmd的显示字符编码从默认的GBK改为UTF-8
deviceName = os.popen("adb devices").read() # 设备名称
platformVersion = os.popen("adb shell getprop ro.build.version.release").read() # 安卓版本
appPackage = os.popen("adb shell dumpsys window w |findstr \/ |findstr name=").read() # 软件名称
desired_caps = \
{
"deviceName": deviceName[:-8],
"platformName": "Android",
"platformVersion": platformVersion,
"appPackage": "tv.danmaku.bili",
"appActivity": "tv.danmaku.bili.MainActivityV2",
"newCommandTimeout": 0, # 设置超时时间, 默认为60s,设置为0关闭。超时时间到后,软件将退出
"ANDROID_UIAUTOMATOR": "uiautomator2"
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.hide_keyboard() # 键盘隐藏
driver.implicitly_wait(5) # 延时(全局生效)
driver.find_elements(by=By.CLASS_NAME, value='android.widget.TextView')[4].click() # 同意用户协议与隐私政策提示弹窗
driver.find_elements(by=By.CLASS_NAME, value='android.widget.ImageView')[0].click() # 左上角登录按钮
# 可以考虑下面命令写个列表然后循环或者封装成方法调用,这里方便理解直接写了。
time.sleep(5) # 界面反应时间
b = os.popen('adb shell input tap 300 710').read()
time.sleep(2)
b = os.popen('adb shell input text 1314520****').read() #输入手机号码
time.sleep(2)
b = os.popen('adb shell input tap 950 670').read() # 点击获取验证码位置
b = os.popen('adb shell input tap 280 800').read()
time.sleep(1)
verification_code = input("请输入验证码")
verification_code = 'adb shell input text %s' % verification_code
b = os.popen(verification_code).read() # 输入验证码
b = os.popen('adb shell input tap 280 800').read()
time.sleep(2)
b = os.popen('adb shell input tap 40 1150').read() # 勾选同意用户协议
time.sleep(1)
b = os.popen('adb shell input tap 500 1000').read() # 点击验证登录