這篇文章將為大家詳細講解有關(guān)Python3爬蟲中Appium的用法,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創(chuàng)新互聯(lián)專注于三江侗網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供三江侗營銷型網(wǎng)站建設(shè),三江侗網(wǎng)站制作、三江侗網(wǎng)頁設(shè)計、三江侗網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造三江侗網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供三江侗網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
Appium 的基本使用
Appium 是一個跨平臺移動端自動化測試工具,可以非常便捷地為 iOS 和 Android 平臺創(chuàng)建自動化測試用例。它可以模擬 App 內(nèi)部的各種操作,如點擊、滑動、文本輸入等,只要我們手工操作的動作 Appium 都可以完成。在前面我們了解過 Selenium,它是一個網(wǎng)頁端的自動化測試工具。Appium 實際上繼承了 Selenium,Appium 也是利用 WebDriver 來實現(xiàn) App 的自動化測試。對 iOS 設(shè)備來說,Appium 使用 UIAutomation 來實現(xiàn)驅(qū)動。對于 Android 來說,它使用 UiAutomator 和 Selendroid 來實現(xiàn)驅(qū)動。
Appium 相當于一個服務(wù)器,我們可以向 Appium 發(fā)送一些操作指令,Appium 就會根據(jù)不同的指令對移動設(shè)備進行驅(qū)動,完成不同的動作。
對于爬蟲來說,我們用 Selenium 來抓取 JavaScript 渲染的頁面,可見即可爬。Appium 同樣也可以,用 Appium 來做 App 爬蟲不失為一個好的選擇。
下面我們來了解 Appium 的基本使用方法。
1. 本節(jié)目標
我們以 Android 平臺的微信為例來演示 Appium 啟動和操作 App 的方法,主要目的是了解利用 Appium 進行自動化測試的流程以及相關(guān) API 的用法。
2. 準備工作
請確保 PC 已經(jīng)安裝好 Appium、Android 開發(fā)環(huán)境和 Python 版本的 Appium API,安裝方法可以參考第 1 章。另外,Android 手機安裝好微信 App。
3. 啟動 APP
Appium 啟動 App 的方式有兩種:一種是用 Appium 內(nèi)置的驅(qū)動器來打開 App,另一種是利用 Python 程序?qū)崿F(xiàn)此操作。下面我們分別進行說明。
首先打開 Appium,啟動界面如圖 11-37 所示。
圖 11-37 Appium 啟動界面
直接點擊 Start Server 按鈕即可啟動 Appium 的服務(wù),相當于開啟了一個 Appium 服務(wù)器。我們可以通過 Appium 內(nèi)置的驅(qū)動或 Python 代碼向 Appium 的服務(wù)器發(fā)送一系列操作指令,Appium 就會根據(jù)不同的指令對移動設(shè)備進行驅(qū)動,完成不同的動作。啟動后運行界面如圖 11-38 所示。
圖 11-38 Server 運行界面
Appium 運行之后正在監(jiān)聽 4723 端口。我們可以向此端口對應(yīng)的服務(wù)接口發(fā)送操作指令,此頁面就會顯示這個過程的操作日志。
將 Android 手機通過數(shù)據(jù)線和運行 Appium 的 PC 相連,同時打開 USB 調(diào)試功能,確保 PC 可以連接到手機。
可以輸入 adb 命令來測試連接情況,如下所示:
adb devices -l
如果出現(xiàn)類似如下結(jié)果,這就說明 PC 已經(jīng)正確連接手機。
List of devices attached 2da42ac0 device usb:336592896X product:leo model:MI_NOTE_Pro device:leo
model 是設(shè)備的名稱,就是后文需要用到的 deviceName 變量。我使用的是小米 Note 頂配版,所以此處名稱為 MI_NOTE_Pro。
如果提示找不到 adb 命令,請檢查 Android 開發(fā)環(huán)境和環(huán)境變量是否配置成功。如果可以成功調(diào)用 adb 命令但不顯示設(shè)備信息,請檢查手機和 PC 的連接情況。
接下來用 Appium 內(nèi)置的驅(qū)動器打開 App,點擊 Appium 中的 Start New Session 按鈕,如圖 11-39 所示。
圖 11-39 操作示例
這時會出現(xiàn)一個配置頁面,如圖 11-40 所示。
圖 11-40 配置頁面
需要配置啟動 App 時的 Desired Capabilities 參數(shù),它們分別是 platformName、deviceName、appPackage、appActivity。
platformName,平臺名稱,需要區(qū)分是 Android 還是 iOS,此處填寫 Android。
deviceName,設(shè)備名稱,是手機的具體類型。
appPackage,APP 程序包名。
appActivity,入口 Activity 名,這里通常需要以。開頭。
在當前配置頁面的左下角也有配置參數(shù)的相關(guān)說明,鏈接是 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md。
我們在 Appium 中加入上面 4 個配置,如圖 11-41 所示。
圖 11-41 配置信息
點擊保存按鈕,保存下來,我們以后可以繼續(xù)使用這個配置。
點擊右下角的 Start Session 按鈕,即可啟動 Android 手機上的微信 App 并進入到啟動頁面。同時 PC 上會彈出一個調(diào)試窗口,從這個窗口我們可以預覽當前手機頁面,并可以查看頁面的源碼,如圖 11-42 所示。
圖 11-42 調(diào)試窗口
點擊左欄中屏幕的某個元素,如選中登錄按鈕,它就會高亮顯示。這時中間欄就顯示了當前選中的按鈕對應(yīng)的源代碼,右欄則顯示了該元素的基本信息,如元素的 id、class、text 等,以及可以執(zhí)行的操作,如 Tap、Send Keys、Clear,如圖 11-43 所示。
圖 11-43 操作選項
點擊中間欄最上方的第三個錄制按鈕,Appium 會開始錄制操作動作,這時我們在窗口中操作 App 的行為都會被記錄下來,Recorder 處可以自動生成對應(yīng)語言的代碼。例如,我們點擊錄制按鈕,然后選中 App 中的登錄按鈕,點擊 Tap 操作,即模擬了按鈕點擊功能,這時手機和窗口的 App 都會跳轉(zhuǎn)到登錄頁面,同時中間欄會顯示此動作對應(yīng)的代碼,如圖 11-44 所示。
圖 11-44 錄制動作
接下來選中左側(cè)的手機號文本框,點擊 Send Keys,對話框就會彈出。輸入手機號,點擊 Send Keys,即可完成文本的輸入,如圖 11-45 所示。
圖 11-45 文本輸入
我們可以在此頁面點擊不同的動作按鈕,即可實現(xiàn)對 App 的控制,同時 Recorder 部分也可以生成對應(yīng)的 Python 代碼。
下面我們看看使用 Python 代碼驅(qū)動 App 的方法。首先需要在代碼中指定一個 Appium Server,而這個 Server 在剛才打開 Appium 的時候就已經(jīng)開啟了,是在 4723 端口上運行的,配置如下所示:
server = 'http://localhost:4723/wd/hub'
用字典來配置 Desired Capabilities 參數(shù),代碼如下所示:
desired_caps = { 'platformName': 'Android', 'deviceName': 'MI_NOTE_Pro', 'appPackage': 'com.tencent.mm', 'appActivity': '.ui.LauncherUI' }
新建一個 Session,這類似點擊 Appium 內(nèi)置驅(qū)動的 Start Session 按鈕相同的功能,代碼實現(xiàn)如下所示:
from appium import webdriver from selenium.webdriver.support.ui import WebDriverWait driver = webdriver.Remote(server, desired_caps)
配置完成后運行,就可以啟動微信 App 了。但是現(xiàn)在僅僅是可以啟動 App,還沒有做任何動作。
再用代碼來模擬剛才演示的兩個動作:一個是點擊 “登錄” 按鈕,一個是輸入手機號。
看看剛才 Appium 內(nèi)置驅(qū)動器內(nèi)的 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 選擇器路徑太長,選擇方式?jīng)]有那么科學,獲取元素時也沒有設(shè)置等待,很可能會有超時異常。所以我們修改一下,將其修改為通過 ID 查找元素,設(shè)置延時等待,兩次操作的代碼改寫如下所示:
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 代碼實現(xiàn)了 App 的操作。
4. API
接下來看看使用代碼如何操作 App、總結(jié)相關(guān) API 的用法。這里使用的 Python 庫為 AppiumPythonClient,其 GitHub 地址為 https://github.com/appium/python-client,此庫繼承自 Selenium,使用方法與 Selenium 有很多共同之處。
初始化
需要配置 Desired Capabilities 參數(shù),完整的配置說明可以參考 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md,一般來說我們我們配置幾個基本參數(shù)即可:
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 參數(shù)為安裝包所在路徑,這樣程序啟動時就會自動向手機安裝并啟動 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 中通用的查找方法來實現(xiàn)元素的查找,如下所示:
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 驅(qū)動,具體可以參考:https://github.com/appium/appium-xcuitest–driver。
點擊
點擊可以使用 tap() 方法,該方法可以模擬手指點擊(最多五個手指),可設(shè)置按時長短(毫秒),代碼如下所示:
tap(self, positions, duration=None)
參數(shù):
positions,點擊的位置組成的列表。
duration,點擊持續(xù)時間。
實例如下:
driver.tap([(100, 20), (100, 60), (100, 100)], 500)
這樣就可以模擬點擊屏幕的某幾個點。
另外對于某個元素如按鈕來說,我們可以直接調(diào)用 cilck() 方法實現(xiàn)模擬點擊,實例如下所示:
button = find_element_by_id('com.tencent.mm:id/btn') button.click()
這樣獲取元素之后,然后調(diào)用 click() 方法即可實現(xiàn)該元素的模擬點擊。
屏幕拖動
可以使用 scroll() 方法模擬屏幕滾動,用法如下所示:
scroll(self, origin_el, destination_el)
可以實現(xiàn)從元素 origin_el 滾動至元素 destination_el。
參數(shù):
original_el,被操作的元素
destination_el,目標元素
實例如下:
driver.scroll(el1,el2)
我們還可以使用 swipe() 模擬從 A 點滑動到 B 點,用法如下:
swipe(self, start_x, start_y, end_x, end_y, duration=None)
參數(shù):
start_x,開始位置的橫坐標
start_y,開始位置的縱坐標
end_x,終止位置的橫坐標
end_y,終止位置的縱坐標
duration,持續(xù)時間,毫秒
實例如下:
driver.swipe(100, 100, 100, 400, 5000)
這樣可以實現(xiàn)在 5s 由 (100, 100) 滑動到 (100, 400)。
另外可以使用 flick() 方法模擬從 A 點快速滑動到 B 點,用法如下:
flick(self, start_x, start_y, end_x, end_y)
參數(shù):
start_x,開始位置的橫坐標
start_y,開始位置的縱坐標
end_x,終止位置的橫坐標
end_y,終止位置的縱坐標
實例如下:
driver.flick(100, 100, 100, 400)
拖拽
可以使用 drag_and_drop() 實現(xiàn)某個元素拖動到另一個目標元素上。
用法如下:
drag_and_drop(self, origin_el, destination_el)
可以實現(xiàn)元素 origin_el 拖拽至元素 destination_el。
參數(shù):
original_el,被拖拽的元素
destination_el,目標元素
實例如下所示:
driver.drag_and_drop(el1, el2)
文本輸入
可以使用 set_text() 方法實現(xiàn)文本輸入,如下所示:
el = find_element_by_id('com.tencent.mm:id/cjk') el.set_text('Hello')
我們選中一個文本框元素之后,然后調(diào)用 set_text() 方法即可實現(xiàn)文本輸入。
動作鏈
與 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 實現(xiàn)點擊操作。
如果想要實現(xiàn)拖動操作,可以用如下方式:
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。
關(guān)于Python3爬蟲中Appium的用法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
文章題目:Python3爬蟲中Appium的用法
URL標題:http://jinyejixie.com/article32/gpgdsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、軟件開發(fā)、品牌網(wǎng)站制作、App設(shè)計、Google、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)