python爬⾍之Appium⼿机APP爬⾍
Appium的功能其实很简单:监听⼀个端⼝,然后接收由client发送来的command,翻译这些command,把这些command转成移动设备可以理解的形式发送给移动设备,然后移动设备执⾏完这些command后把执⾏结果返回给appium server,appium server再把执⾏结果返回给client。
在这⾥client其实就是发起command的设备,⼀般来说就是我们代码执⾏的机器,执⾏appium测试代码的机器。狭义点理解,可以把client理解成是代码,这些代码可以是
java/ruby/python/js的,只要它实现了webdriver标准协议就可以。
⼆、Appium环境搭建
1、需要⽤到的软件包如下:
(1)node.js
(2)Java SDK
(3)Android SDK
(4)Appium Windows
(5)夜神模拟器
(6)Python
(7)Appium-python-Client
(2)安装好后,执⾏npm install -g appium-doctor(npm是node.js的包管理⼯具,下载appium-doctor可以检测Appium的环境搭建是否成功)
(3)执⾏appium-doctor检测Appium的环境搭建情况
上图打对勾的地⽅即是要坚持的环境变量配置情况,只有全部打对勾,才说明环境搭配成功
3、Java SDK
4、Android SDK
5、Appium Windows
(2)安装Appium Windows
6、夜神模拟器
(2)安装
7、Python与Appium-Python-Client的安装就不讲了
8、使⽤appium-doctor检测环境是否安装成功,同第2步
9、测试是否能正常启动
根据appium的⼯作原理:
(1)测试client与appium是否能通信成功
当运⾏代码时,Appium就会响应,虽然是404,但只是因为Appium没有到执⾏命令的设备
(2)测试appium与模拟器是否能通信成功
不管遇见什么样的错误,只要把Origin error:后⾯的报错信息复制到百度上寻解决办法基本都能到,这⾥表⽰不能到连接了的安卓设备,所以我们先要连接安装设备,在命令⾏中:
检测是否有连接的设备,下⾯表⽰没有连接的设备
连接已经打开的安卓设备,连接成功
再检测⼀下,发现有了
接下来就可以点击Start session,将Appium连接上安卓设备,连接成功与设备同步
现在我们使⽤代码驱动Appium,Appium再将命令转给安卓设备,模拟器打开,说明成功了,可以正式开始抓取APP的数据了
现在可以解释⼀下platformName、platformVersion、deviceName、appPackage、appActivity、noReset这⼏个参数的来历了
platformName(系统名称):Android、IOS、Windows、Linux
plaformVersion(系统版本)
deviceName(设备名称,即设备运⾏的地址,默认为127.0.0.1:62001)
xpath语法 pythonappPackage(要打开哪个软件)、appActivity(要打开的软件的活动页⾯)
appPackage、appActivity两个参数可以通过点开模拟器上想要打开的软件,然后通过命令⾏获取
10、⽤法基本与selenium类似,下附简单的代码(定位时,能使⽤id,尽量不使⽤xpath)
#!/usr/bin/env python
# coding: utf-8
# In[63]:
from appium import webdriver
# In[64]:
from time import sleep
# In[65]:
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
# In[66]:
from selenium.webdrivermon.by import By
# In[67]:
desired_caps = {
"platformName": "Android",
"platformVersion": "5.1.1",
"deviceName": "127.0.0.1:62001",
"appPackage": "com.wuba",
"appActivity": ".activity.launch.LaunchActivity",
"noReset": "False"# 清除缓存
}
# In[68]:
driver = webdriver.Remote("127.0.0.1:4723/wd/hub", desired_caps)
# In[69]:
# 获取⼿机屏幕长宽
screenWidth = _window_size()["width"]
screenHeight = _window_size()["height"]
# In[70]:
# beijing_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v4.view.ViewPager/andro # WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, beijing_xpath))).click()
# In[72]:
hotCityId = "com.wuba:id/fl_hot"
hotCity = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "com.wuba:id/fl_ho
t")))
# In[73]:
hotCity.find_element_by_xpath("//android.widget.LinearLayout[1]").click()
# In[74]:
# driver.find_element_by_id("com.wuba:id/launch_op_bt_ok").click()
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "com.wuba:id/launch_op_bt_ok"))).click()
# In[75]:
ershoufang_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.wid WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ershoufang_xpath))).click()
# In[76]:
ershoufang_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.View/android.support.v4.view.ViewPager/android.widget.FrameLayout/android.widget.RelativeLayout[1]/android.wi WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, ershoufang_xpath))).click()
# In[78]:
items_id = "com.wuba:id/recyclerView"
items = driver.find_element_by_id(items_id)
while 1:
driver.swipe(screenWidth*0.5, screenHeight*0.85, screenWidth*0.5, screenHeight*0.25, 500) ls = items.find_elements_by_xpath("//android.widget.LinearLayout")
sleep(3)
# In[ ]:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论