引言
本篇文章环境配置是又臭又长,想直接看代码的老铁,可以直接跳到后边
所需环境
python 这里我用的是3.6
appium 所需要的环境配置:
jdk1.8.0
android sdk
模拟器:mumu 模拟器
环境配置
模拟器
mumu 模拟器下载地址
查看模拟器安卓版本
打开设置一直往下滑看到 关于平板电脑 点进去就可以看到Android 版本了
Appium
Android SDK 下载
这里我用的是一个国内的 Android 工具的下载网站,因为官方的下载慢。。
建议下载24.4.1 里的工具,window 版本的小伙伴建议下载我圈起来的那个
Android SDK 环境配置
1,安装好SDK 之后 ,打开目录
2,这张图我是当初安装的时候上网找到的,作者是谁我忘记了,推荐参考这个来安装
注:Android sdk 版本是向下兼容的,你可以只安装一个比你安卓版本高一个版本的就可以了,当然你也可以从9一直安装到你模拟器的版本,再低的就不要安装了
3,下载好sdk 版本之后就到了 ,配置环境变量,新建一个ANDROID_HOME,值写你的安装地址
4,在环境变量里找到 Path
新建
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools
%ANDROID_HOME%\build-tools\28.0.0
5,打开Appium,把我们的jdk和sdk目录填上去就可以了
6,开启Appium 服务,进入到版面之后点击这个长得像搜索框的搜索框
7,配置连接模拟器的参数,具体的参数
注: 这里我是根据mumu 模拟器来的,如果有老铁用的是其它的模拟器的话,就只能自己去百度了
{
“platformName”: “Android”,
“deviceName”: “127.0.0.1:7555”,
“platformVersion”: “6.0.1”,
“appPackage”: “com.ss.android.ugc.aweme”,
“appActivity”: “com.ss.android.ugc.aweme.splash.SplashActivity”,
“noReset”: true,
“unicodekeyboard”: true,
“resetkeyboard”: true
}
字段解析:
platformName:操作系统
deviceName:当前设备端口号。使用的哪个模拟器,7555是mumu模拟器,7555端口号是在安装目录emulator\nemu\vms\myandrovm_vbox86\myandrovm_vbox86.nemu里配置的
appPackage:app包名
appActivity:app活动类名
保存后,点击启动会话,到这里环境配置就算是完工了
利用Appium 获取抖音按键demo
打开我们的模拟器,安装好抖音
启动我们的 Appium 会话,我们就会进到这个选取demo页面
1,当我们点击他的父节点会发现页面全选了
2,这时候就得一个个点进他的子节点,一个个找我们需要的按键demo,比如:搜索框。
/*
如何获取有用的信息?
*/
resource-id 这个是我们需要的东西,用来定位到 demo位置的 结果id
如何判断按键demo是否可以点击,clickable 为 true,意味着这个demo可以点击
如果clickable 为 false ,我这里的想法是写到 try 方法里边模拟鼠标强制点击
重要的是: resource-id 会在抖音每一次更新过后会发生改变
demo拿到了,我们开始撸代码
代码实现自动化点击
业务目标
- 进入抖音,点击搜索框,输入美女搜索,点击用户demo,出现用户列表之后,点击进入到用户详情页之后返回点击下一个用户。
1,第一步先开启服务让appium连接到模拟器,进入到sdk目录下边的 platform-tools 。进入cmd,输入
adb connect 127.0.0.1:7555
adb devices
2,代码连接模拟器
from appium import webdriver
desired_caps = {}
# 在三个配的是手机
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '6.0.1' # 这里需要改成对应设备版本
desired_caps['deviceName'] = '127.0.0.1:7555'
# 下面俩配的是app的信息,aapt可以查
desired_caps['appPackage'] = 'com.ss.android.ugc.aweme' # 抖音的
desired_caps['appActivity'] = '.splash.SplashActivity'
# 下面俩配的是键盘,不用键盘可以不配,用完需要手动恢复下手机键盘,appium不会自动恢复
desired_caps['unicodeKeyboard'] = 'true' # 使用Unicode键盘
desired_caps['resetKeyboard'] = 'true' # 重置当前输入法
# APP是否重新设置,没有这个每次都会重新设置,一定要有
desired_caps["noReset"] = "true"
# 下面是远程连接设备
driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps)
3,自动点击进入用户列表界面
#得到窗口大小
def get_size():
x=driver.get_window_size()['width']
y=driver.get_window_size()['height']
return x, y
def click_info():
driver.implicitly_wait(10)
# 点击搜索
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.ss.android.ugc.aweme:id/ctd")').click()
time.sleep(3)
driver.implicitly_wait(10) # 因为**模拟器很卡,所以睡久点
# 点击搜索,输入内容
shuru = driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.ss.android.ugc.aweme:id/aia")')
shuru.send_keys(u'美女')
shuru = driver.find_element_by_id('com.ss.android.ugc.aweme:id/kqe').click()
# driver.swipe(shuru)
# 因为这里的搜索按钮clickable 为false ,强制点击
try:
ActionChains(driver).click(shuru).perform() # 点击确认位置-搜索键
except:
pass
time.sleep(3)
driver.implicitly_wait(10)
# 点击用户框
user = driver.find_elements_by_id('android:id/text1')[2]
user.click()
time.sleep(3)
4,
- 进入用户列表界面之后我们再用Appium 查看抖音键位demo之后 发现 用户列表的 clickable事件为 false ,思路我上边也写了,直接强制点击;
- 在观察发现,他们的 resource-id 都长得一样,意味着我们上边的那种利用resource-id 定位的方法没用了,这里我换一个思路,仔细观察发现,最下边有个 bounds 里边有他们的坐标,这样意味着我们可以利用坐标来获取点击,nice!
5,坐标获取
# 屏幕向上滑动
def swipe(time = 1000):
# 窗口大小
size = get_size()
# time = 1000 ms = 1秒
# 获取到第一个用户列表的坐标 [0,209][810,334]
x1 = int(size[0] * 0)
x2 = int(size[0] * 1)
y1 = int(size[1] - 1231)
y2 = int(size[1] - 1106)
# 点击
time.sleep(1)
driver.swipe(x1, y1, x2, y2,time)
time.sleep(3)
# 点击返回
driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.ss.android.ugc.aweme:id/l6")').click()
time.sleep(3)
# 屏幕上滑 第二个坐标 [0,351][810,528]
a1 = int(size(0) * 0)
a2 = int(size[0] * 1)
b1 = y1 + 142
b2 = y2 + 194
time.sleep(1)
driver.swipe(x1, y1, x2, y2,time)
time.sleep(3)
time.sleep(5)
for i in range(1,1000):
swipe()
print(i)
总结
应用于业务上的话,可以利用python+Mitmproxy 写一个实时监控脚本获取数据再加上我这篇自动化可以批量获取抖音数据,应该可以满足一些业务需求
如果坐标点击出问题的话,可以多试试几个坐标。
完整代码就是上边的一个个模块拼接起来,如果有什么不懂的,欢迎留言
如果对你有帮助不妨一键三连,不客气