您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Python3爬蟲中Appium的用法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Appium 的基本使用
Appium 是一個跨平臺移動端自動化測試工具,可以非常便捷地為 iOS 和 Android 平臺創建自動化測試用例。它可以模擬 App 內部的各種操作,如點擊、滑動、文本輸入等,只要我們手工操作的動作 Appium 都可以完成。在前面我們了解過 Selenium,它是一個網頁端的自動化測試工具。Appium 實際上繼承了 Selenium,Appium 也是利用 WebDriver 來實現 App 的自動化測試。對 iOS 設備來說,Appium 使用 UIAutomation 來實現驅動。對于 Android 來說,它使用 UiAutomator 和 Selendroid 來實現驅動。
Appium 相當于一個服務器,我們可以向 Appium 發送一些操作指令,Appium 就會根據不同的指令對移動設備進行驅動,完成不同的動作。
對于爬蟲來說,我們用 Selenium 來抓取 JavaScript 渲染的頁面,可見即可爬。Appium 同樣也可以,用 Appium 來做 App 爬蟲不失為一個好的選擇。
下面我們來了解 Appium 的基本使用方法。
1. 本節目標
我們以 Android 平臺的微信為例來演示 Appium 啟動和操作 App 的方法,主要目的是了解利用 Appium 進行自動化測試的流程以及相關 API 的用法。
2. 準備工作
請確保 PC 已經安裝好 Appium、Android 開發環境和 Python 版本的 Appium API,安裝方法可以參考第 1 章。另外,Android 手機安裝好微信 App。
3. 啟動 APP
Appium 啟動 App 的方式有兩種:一種是用 Appium 內置的驅動器來打開 App,另一種是利用 Python 程序實現此操作。下面我們分別進行說明。
首先打開 Appium,啟動界面如圖 11-37 所示。
圖 11-37 Appium 啟動界面
直接點擊 Start Server 按鈕即可啟動 Appium 的服務,相當于開啟了一個 Appium 服務器。我們可以通過 Appium 內置的驅動或 Python 代碼向 Appium 的服務器發送一系列操作指令,Appium 就會根據不同的指令對移動設備進行驅動,完成不同的動作。啟動后運行界面如圖 11-38 所示。
圖 11-38 Server 運行界面
Appium 運行之后正在監聽 4723 端口。我們可以向此端口對應的服務接口發送操作指令,此頁面就會顯示這個過程的操作日志。
將 Android 手機通過數據線和運行 Appium 的 PC 相連,同時打開 USB 調試功能,確保 PC 可以連接到手機。
可以輸入 adb 命令來測試連接情況,如下所示:
adb devices -l
如果出現類似如下結果,這就說明 PC 已經正確連接手機。
List of devices attached 2da42ac0 device usb:336592896X product:leo model:MI_NOTE_Pro device:leo
model 是設備的名稱,就是后文需要用到的 deviceName 變量。我使用的是小米 Note 頂配版,所以此處名稱為 MI_NOTE_Pro。
如果提示找不到 adb 命令,請檢查 Android 開發環境和環境變量是否配置成功。如果可以成功調用 adb 命令但不顯示設備信息,請檢查手機和 PC 的連接情況。
接下來用 Appium 內置的驅動器打開 App,點擊 Appium 中的 Start New Session 按鈕,如圖 11-39 所示。
圖 11-39 操作示例
這時會出現一個配置頁面,如圖 11-40 所示。
圖 11-40 配置頁面
需要配置啟動 App 時的 Desired Capabilities 參數,它們分別是 platformName、deviceName、appPackage、appActivity。
platformName,平臺名稱,需要區分是 Android 還是 iOS,此處填寫 Android。
deviceName,設備名稱,是手機的具體類型。
appPackage,APP 程序包名。
appActivity,入口 Activity 名,這里通常需要以。開頭。
在當前配置頁面的左下角也有配置參數的相關說明,鏈接是 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md。
我們在 Appium 中加入上面 4 個配置,如圖 11-41 所示。
圖 11-41 配置信息
點擊保存按鈕,保存下來,我們以后可以繼續使用這個配置。
點擊右下角的 Start Session 按鈕,即可啟動 Android 手機上的微信 App 并進入到啟動頁面。同時 PC 上會彈出一個調試窗口,從這個窗口我們可以預覽當前手機頁面,并可以查看頁面的源碼,如圖 11-42 所示。
圖 11-42 調試窗口
點擊左欄中屏幕的某個元素,如選中登錄按鈕,它就會高亮顯示。這時中間欄就顯示了當前選中的按鈕對應的源代碼,右欄則顯示了該元素的基本信息,如元素的 id、class、text 等,以及可以執行的操作,如 Tap、Send Keys、Clear,如圖 11-43 所示。
圖 11-43 操作選項
點擊中間欄最上方的第三個錄制按鈕,Appium 會開始錄制操作動作,這時我們在窗口中操作 App 的行為都會被記錄下來,Recorder 處可以自動生成對應語言的代碼。例如,我們點擊錄制按鈕,然后選中 App 中的登錄按鈕,點擊 Tap 操作,即模擬了按鈕點擊功能,這時手機和窗口的 App 都會跳轉到登錄頁面,同時中間欄會顯示此動作對應的代碼,如圖 11-44 所示。
圖 11-44 錄制動作
接下來選中左側的手機號文本框,點擊 Send Keys,對話框就會彈出。輸入手機號,點擊 Send Keys,即可完成文本的輸入,如圖 11-45 所示。
圖 11-45 文本輸入
我們可以在此頁面點擊不同的動作按鈕,即可實現對 App 的控制,同時 Recorder 部分也可以生成對應的 Python 代碼。
下面我們看看使用 Python 代碼驅動 App 的方法。首先需要在代碼中指定一個 Appium Server,而這個 Server 在剛才打開 Appium 的時候就已經開啟了,是在 4723 端口上運行的,配置如下所示:
server = 'http://localhost:4723/wd/hub'
用字典來配置 Desired Capabilities 參數,代碼如下所示:
desired_caps = { 'platformName': 'Android', 'deviceName': 'MI_NOTE_Pro', 'appPackage': 'com.tencent.mm', 'appActivity': '.ui.LauncherUI' }
新建一個 Session,這類似點擊 Appium 內置驅動的 Start Session 按鈕相同的功能,代碼實現如下所示:
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait driver = webdriver.Remote(server, desired_caps)
配置完成后運行,就可以啟動微信 App 了。但是現在僅僅是可以啟動 App,還沒有做任何動作。
再用代碼來模擬剛才演示的兩個動作:一個是點擊 “登錄” 按鈕,一個是輸入手機號。
看看剛才 Appium 內置驅動器內的 Recorder 錄制生成的 Python 代碼,自動生成的代碼非常累贅,例如點擊“登錄”按鈕的代碼如下所示:
el1 = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android. widget.FrameLayout/android.view.View/android.widget.FrameLayout/android.widget.LinearLayout/android.widget. FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.Button[1]") el1.click()
這段代碼的 XPath 選擇器路徑太長,選擇方式沒有那么科學,獲取元素時也沒有設置等待,很可能會有超時異常。所以我們修改一下,將其修改為通過 ID 查找元素,設置延時等待,兩次操作的代碼改寫如下所示:
wait = WebDriverWait(driver, 30) login = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cjk'))) login.click() phone = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/h3'))) phone.set_text('18888888888')
綜上所述,完整的代碼如下所示:
from appium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC server = 'http://localhost:4723/wd/hub' desired_caps = { 'platformName': 'Android', 'deviceName': 'MI_NOTE_Pro', 'appPackage': 'com.tencent.mm', 'appActivity': '.ui.LauncherUI' } driver = webdriver.Remote(server, desired_caps) wait = WebDriverWait(driver, 30) login = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/cjk'))) login.click() phone = wait.until(EC.presence_of_element_located((By.ID, 'com.tencent.mm:id/h3'))) phone.set_text('18888888888')
一定要重新連接手機,再運行此代碼,這時即可觀察到手機上首先彈出了微信歡迎頁面,然后模擬點擊登錄按鈕、輸入手機號,操作完成。這樣我們就成功使用 Python 代碼實現了 App 的操作。
4. API
接下來看看使用代碼如何操作 App、總結相關 API 的用法。這里使用的 Python 庫為 AppiumPythonClient,其 GitHub 地址為 https://github.com/appium/python-client,此庫繼承自 Selenium,使用方法與 Selenium 有很多共同之處。
初始化
需要配置 Desired Capabilities 參數,完整的配置說明可以參考 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md,一般來說我們我們配置幾個基本參數即可:
from appium import webdriver server = 'http://localhost:4723/wd/hub' desired_caps = { 'platformName': 'Android', 'deviceName': 'MI_NOTE_Pro', 'appPackage': 'com.tencent.mm', 'appActivity': '.ui.LauncherUI' } driver = webdriver.Remote(server, desired_caps)
這里配置了啟動微信 App 的 Desired Capabilities,這樣 Appnium 就會自動查找手機上的包名和入口類,然后將其啟動。包名和入口類的名稱可以在安裝包中的 AndroidManifest.xml 文件獲取。
如果要打開的 App 沒有事先在手機上安裝,我們可以直接指定 App 參數為安裝包所在路徑,這樣程序啟動時就會自動向手機安裝并啟動 App,如下所示:
from appium import webdriver server = 'http://localhost:4723/wd/hub' desired_caps = { 'platformName': 'Android', 'deviceName': 'MI_NOTE_Pro', 'app': './weixin.apk' } driver = webdriver.Remote(server, desired_caps)
程序啟動的時候就會尋找 PC 當前路徑下的 APK 安裝包,然后將其安裝到手機中并啟動。
查找元素
我們可以使用 Selenium 中通用的查找方法來實現元素的查找,如下所示:
el = driver.find_element_by_id('com.tencent.mm:id/cjk')
在 Selenium 中,其他查找元素的方法同樣適用,在此不再贅述。
在 Android 平臺上,我們還可以使用 UIAutomator 來進行元素選擇,如下所示:
el = self.driver.find_element_by_android_uiautomator('new UiSelector().description("Animation")') els = self.driver.find_elements_by_android_uiautomator('new UiSelector().clickable(true)')
在 iOS 平臺上,我們可以使用 UIAutomation 來進行元素選擇,如下所示:
el = self.driver.find_element_by_ios_uiautomation('.elements()[0]') els = self.driver.find_elements_by_ios_uiautomation('.elements()')
還可以使用 iOS Predicates 來進行元素選擇,如下所示:
el = self.driver.find_element_by_ios_predicate('wdName == "Buttons"') els = self.driver.find_elements_by_ios_predicate('wdValue == "SearchBar" AND isWDDivisible == 1')
也可以使用 iOS Class Chain 來進行選擇,如下所示:
el = self.driver.find_element_by_ios_class_chain('XCUIElementTypeWindow/XCUIElementTypeButton[3]') els = self.driver.find_elements_by_ios_class_chain('XCUIElementTypeWindow/XCUIElementTypeButton')
但是此種方法只適用于 XCUITest 驅動,具體可以參考:https://github.com/appium/appium-xcuitest–driver。
點擊
點擊可以使用 tap() 方法,該方法可以模擬手指點擊(最多五個手指),可設置按時長短(毫秒),代碼如下所示:
tap(self, positions, duration=None)
參數:
positions,點擊的位置組成的列表。
duration,點擊持續時間。
實例如下:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)
這樣就可以模擬點擊屏幕的某幾個點。
另外對于某個元素如按鈕來說,我們可以直接調用 cilck() 方法實現模擬點擊,實例如下所示:
button = find_element_by_id('com.tencent.mm:id/btn') button.click()
這樣獲取元素之后,然后調用 click() 方法即可實現該元素的模擬點擊。
屏幕拖動
可以使用 scroll() 方法模擬屏幕滾動,用法如下所示:
scroll(self, origin_el, destination_el)
可以實現從元素 origin_el 滾動至元素 destination_el。
參數:
original_el,被操作的元素
destination_el,目標元素
實例如下:
driver.scroll(el1,el2)
我們還可以使用 swipe() 模擬從 A 點滑動到 B 點,用法如下:
swipe(self, start_x, start_y, end_x, end_y, duration=None)
參數:
start_x,開始位置的橫坐標
start_y,開始位置的縱坐標
end_x,終止位置的橫坐標
end_y,終止位置的縱坐標
duration,持續時間,毫秒
實例如下:
driver.swipe(100, 100, 100, 400, 5000)
這樣可以實現在 5s 由 (100, 100) 滑動到 (100, 400)。
另外可以使用 flick() 方法模擬從 A 點快速滑動到 B 點,用法如下:
flick(self, start_x, start_y, end_x, end_y)
參數:
start_x,開始位置的橫坐標
start_y,開始位置的縱坐標
end_x,終止位置的橫坐標
end_y,終止位置的縱坐標
實例如下:
driver.flick(100, 100, 100, 400)
拖拽
可以使用 drag_and_drop() 實現某個元素拖動到另一個目標元素上。
用法如下:
drag_and_drop(self, origin_el, destination_el)
可以實現元素 origin_el 拖拽至元素 destination_el。
參數:
original_el,被拖拽的元素
destination_el,目標元素
實例如下所示:
driver.drag_and_drop(el1, el2)
文本輸入
可以使用 set_text() 方法實現文本輸入,如下所示:
el = find_element_by_id('com.tencent.mm:id/cjk') el.set_text('Hello')
我們選中一個文本框元素之后,然后調用 set_text() 方法即可實現文本輸入。
動作鏈
與 Selenium 中的 ActionChains 類似,Appium 中的 TouchAction 可支持的方法有 tap()、press()、long_press()、release()、move_to()、wait()、cancel() 等,實例如下所示:
el = self.driver.find_element_by_accessibility_id('Animation') action = TouchAction(self.driver) action.tap(el).perform()
首先選中一個元素,然后利用 TouchAction 實現點擊操作。
如果想要實現拖動操作,可以用如下方式:
els = self.driver.find_elements_by_class_name('listView') a1 = TouchAction() a1.press(els[0]).move_to(x=10, y=0).move_to(x=10, y=-75).move_to(x=10, y=-600).release() a2 = TouchAction() a2.press(els[1]).move_to(x=10, y=10).move_to(x=10, y=-300).move_to(x=10, y=-600).release()
利用以上 API,我們就可以完成絕大部分操作。更多的 API 操作可以參考 https://testerhome.com/topics/3711。
關于Python3爬蟲中Appium的用法就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。