一、Appium工作原理(詳情見:https://www.cnblogs.com/sophia194910/p/7515165.html)
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、node.js(參考:https://blog.csdn.net/u010654583/article/details/85125377)
(1)下載地址:http://nodejs.cn/download/
(2)安裝好后,執行npm install -g appium-doctor(npm是node.js的包管理工具,下載appium-doctor可以檢測Appium的環境搭建是否成功)
(3)執行appium-doctor檢測Appium的環境搭建情況
上圖打對勾的地方即是要堅持的環境變量配置情況,只有全部打對勾,才說明環境搭配成功
3、Java SDK
(1)下載地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html
(2)安裝Java SDK文件,並配置環境變量,最后檢測是否安裝成功(參考:https://jingyan.baidu.com/article/d45ad148ba5ab169552b80d3.html)
4、Android SDK
(1)下載地址:https://developer.android.com/studio/(現在已經沒有單獨的解壓包了,只有跟Android Studio一起下載)
(2)安裝好后,配置環境變量,最后檢測是否安裝成功(參考:https://www.cnblogs.com/nebie/p/9145627.html)
5、Appium Windows
(1)下載地址:http://appium.io/
(2)安裝Appium Windows
6、夜神模擬器
(1)下載地址:https://www.yeshen.com/
(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)
appPackage(要打開哪個軟件)、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.webdriver.common.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("http://127.0.0.1:4723/wd/hub", desired_caps) # In[69]: # 獲取手機屏幕長寬 screenWidth = driver.get_window_size()["width"] screenHeight = driver.get_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/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout/android.widget.LinearLayout[2]/android.view.View/android.widget.LinearLayout[1]" # 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_hot"))) # 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.widget.FrameLayout/android.view.View/android.view.View/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.GridView/android.view.View[4]/android.widget.ImageView" 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.widget.FrameLayout/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.LinearLayout/android.widget.LinearLayout/android.view.View[1]/android.widget.LinearLayout[1]/android.widget.TextView" 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[ ]: