久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

Python3爬蟲中Appium的用法

這篇文章將為大家詳細(xì)講解有關(guān)Python3爬蟲中Appium的用法,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

成都創(chuàng)新互聯(lián)專注于三江侗網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供三江侗營(yíng)銷型網(wǎng)站建設(shè),三江侗網(wǎng)站制作、三江侗網(wǎng)頁設(shè)計(jì)、三江侗網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造三江侗網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供三江侗網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

Appium 的基本使用

Appium 是一個(gè)跨平臺(tái)移動(dòng)端自動(dòng)化測(cè)試工具,可以非常便捷地為 iOS 和 Android 平臺(tái)創(chuàng)建自動(dòng)化測(cè)試用例。它可以模擬 App 內(nèi)部的各種操作,如點(diǎn)擊、滑動(dòng)、文本輸入等,只要我們手工操作的動(dòng)作 Appium 都可以完成。在前面我們了解過 Selenium,它是一個(gè)網(wǎng)頁端的自動(dòng)化測(cè)試工具。Appium 實(shí)際上繼承了 Selenium,Appium 也是利用 WebDriver 來實(shí)現(xiàn) App 的自動(dòng)化測(cè)試。對(duì) iOS 設(shè)備來說,Appium 使用 UIAutomation 來實(shí)現(xiàn)驅(qū)動(dòng)。對(duì)于 Android 來說,它使用 UiAutomator 和 Selendroid 來實(shí)現(xiàn)驅(qū)動(dòng)。

Appium 相當(dāng)于一個(gè)服務(wù)器,我們可以向 Appium 發(fā)送一些操作指令,Appium 就會(huì)根據(jù)不同的指令對(duì)移動(dòng)設(shè)備進(jìn)行驅(qū)動(dòng),完成不同的動(dòng)作。

對(duì)于爬蟲來說,我們用 Selenium 來抓取 JavaScript 渲染的頁面,可見即可爬。Appium 同樣也可以,用 Appium 來做 App 爬蟲不失為一個(gè)好的選擇。

下面我們來了解 Appium 的基本使用方法。

1. 本節(jié)目標(biāo)

我們以 Android 平臺(tái)的微信為例來演示 Appium 啟動(dòng)和操作 App 的方法,主要目的是了解利用 Appium 進(jìn)行自動(dòng)化測(cè)試的流程以及相關(guān) API 的用法。

2. 準(zhǔn)備工作

請(qǐng)確保 PC 已經(jīng)安裝好 Appium、Android 開發(fā)環(huán)境和 Python 版本的 Appium API,安裝方法可以參考第 1 章。另外,Android 手機(jī)安裝好微信 App。

3. 啟動(dòng) APP

Appium 啟動(dòng) App 的方式有兩種:一種是用 Appium 內(nèi)置的驅(qū)動(dòng)器來打開 App,另一種是利用 Python 程序?qū)崿F(xiàn)此操作。下面我們分別進(jìn)行說明。

首先打開 Appium,啟動(dòng)界面如圖 11-37 所示。

Python3爬蟲中Appium的用法

圖 11-37 Appium 啟動(dòng)界面

直接點(diǎn)擊 Start Server 按鈕即可啟動(dòng) Appium 的服務(wù),相當(dāng)于開啟了一個(gè) Appium 服務(wù)器。我們可以通過 Appium 內(nèi)置的驅(qū)動(dòng)或 Python 代碼向 Appium 的服務(wù)器發(fā)送一系列操作指令,Appium 就會(huì)根據(jù)不同的指令對(duì)移動(dòng)設(shè)備進(jìn)行驅(qū)動(dòng),完成不同的動(dòng)作。啟動(dòng)后運(yùn)行界面如圖 11-38 所示。

Python3爬蟲中Appium的用法

圖 11-38 Server 運(yùn)行界面

Appium 運(yùn)行之后正在監(jiān)聽 4723 端口。我們可以向此端口對(duì)應(yīng)的服務(wù)接口發(fā)送操作指令,此頁面就會(huì)顯示這個(gè)過程的操作日志。

將 Android 手機(jī)通過數(shù)據(jù)線和運(yùn)行 Appium 的 PC 相連,同時(shí)打開 USB 調(diào)試功能,確保 PC 可以連接到手機(jī)。

可以輸入 adb 命令來測(cè)試連接情況,如下所示:

adb devices -l

如果出現(xiàn)類似如下結(jié)果,這就說明 PC 已經(jīng)正確連接手機(jī)。

List of devices attached
2da42ac0 device usb:336592896X product:leo model:MI_NOTE_Pro device:leo

model 是設(shè)備的名稱,就是后文需要用到的 deviceName 變量。我使用的是小米 Note 頂配版,所以此處名稱為 MI_NOTE_Pro。

如果提示找不到 adb 命令,請(qǐng)檢查 Android 開發(fā)環(huán)境和環(huán)境變量是否配置成功。如果可以成功調(diào)用 adb 命令但不顯示設(shè)備信息,請(qǐng)檢查手機(jī)和 PC 的連接情況。

接下來用 Appium 內(nèi)置的驅(qū)動(dòng)器打開 App,點(diǎn)擊 Appium 中的 Start New Session 按鈕,如圖 11-39 所示。

Python3爬蟲中Appium的用法

圖 11-39 操作示例

這時(shí)會(huì)出現(xiàn)一個(gè)配置頁面,如圖 11-40 所示。

Python3爬蟲中Appium的用法

圖 11-40 配置頁面

需要配置啟動(dòng) App 時(shí)的 Desired Capabilities 參數(shù),它們分別是 platformName、deviceName、appPackage、appActivity。

platformName,平臺(tái)名稱,需要區(qū)分是 Android 還是 iOS,此處填寫 Android。

deviceName,設(shè)備名稱,是手機(jī)的具體類型。

appPackage,APP 程序包名。

appActivity,入口 Activity 名,這里通常需要以。開頭。

在當(dāng)前配置頁面的左下角也有配置參數(shù)的相關(guān)說明,鏈接是 https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md。

我們?cè)?Appium 中加入上面 4 個(gè)配置,如圖 11-41 所示。

Python3爬蟲中Appium的用法

圖 11-41 配置信息

點(diǎn)擊保存按鈕,保存下來,我們以后可以繼續(xù)使用這個(gè)配置。

點(diǎn)擊右下角的 Start Session 按鈕,即可啟動(dòng) Android 手機(jī)上的微信 App 并進(jìn)入到啟動(dòng)頁面。同時(shí) PC 上會(huì)彈出一個(gè)調(diào)試窗口,從這個(gè)窗口我們可以預(yù)覽當(dāng)前手機(jī)頁面,并可以查看頁面的源碼,如圖 11-42 所示。

Python3爬蟲中Appium的用法

圖 11-42 調(diào)試窗口

點(diǎn)擊左欄中屏幕的某個(gè)元素,如選中登錄按鈕,它就會(huì)高亮顯示。這時(shí)中間欄就顯示了當(dāng)前選中的按鈕對(duì)應(yīng)的源代碼,右欄則顯示了該元素的基本信息,如元素的 id、class、text 等,以及可以執(zhí)行的操作,如 Tap、Send Keys、Clear,如圖 11-43 所示。Python3爬蟲中Appium的用法

圖 11-43 操作選項(xiàng)

點(diǎn)擊中間欄最上方的第三個(gè)錄制按鈕,Appium 會(huì)開始錄制操作動(dòng)作,這時(shí)我們?cè)诖翱谥胁僮?App 的行為都會(huì)被記錄下來,Recorder 處可以自動(dòng)生成對(duì)應(yīng)語言的代碼。例如,我們點(diǎn)擊錄制按鈕,然后選中 App 中的登錄按鈕,點(diǎn)擊 Tap 操作,即模擬了按鈕點(diǎn)擊功能,這時(shí)手機(jī)和窗口的 App 都會(huì)跳轉(zhuǎn)到登錄頁面,同時(shí)中間欄會(huì)顯示此動(dòng)作對(duì)應(yīng)的代碼,如圖 11-44 所示。

Python3爬蟲中Appium的用法

圖 11-44 錄制動(dòng)作

接下來選中左側(cè)的手機(jī)號(hào)文本框,點(diǎn)擊 Send Keys,對(duì)話框就會(huì)彈出。輸入手機(jī)號(hào),點(diǎn)擊 Send Keys,即可完成文本的輸入,如圖 11-45 所示。

Python3爬蟲中Appium的用法

圖 11-45 文本輸入

我們可以在此頁面點(diǎn)擊不同的動(dòng)作按鈕,即可實(shí)現(xiàn)對(duì) App 的控制,同時(shí) Recorder 部分也可以生成對(duì)應(yīng)的 Python 代碼。

下面我們看看使用 Python 代碼驅(qū)動(dòng) App 的方法。首先需要在代碼中指定一個(gè) Appium Server,而這個(gè) Server 在剛才打開 Appium 的時(shí)候就已經(jīng)開啟了,是在 4723 端口上運(yùn)行的,配置如下所示:

server = 'http://localhost:4723/wd/hub'

用字典來配置 Desired Capabilities 參數(shù),代碼如下所示:

desired_caps = {
    'platformName': 'Android',
    'deviceName': 'MI_NOTE_Pro',
    'appPackage': 'com.tencent.mm',
    'appActivity': '.ui.LauncherUI'
}

新建一個(gè) Session,這類似點(diǎn)擊 Appium 內(nèi)置驅(qū)動(dòng)的 Start Session 按鈕相同的功能,代碼實(shí)現(xiàn)如下所示:

from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
driver = webdriver.Remote(server, desired_caps)

配置完成后運(yùn)行,就可以啟動(dòng)微信 App 了。但是現(xiàn)在僅僅是可以啟動(dòng) App,還沒有做任何動(dòng)作。

再用代碼來模擬剛才演示的兩個(gè)動(dòng)作:一個(gè)是點(diǎn)擊 “登錄” 按鈕,一個(gè)是輸入手機(jī)號(hào)。

看看剛才 Appium 內(nèi)置驅(qū)動(dòng)器內(nèi)的 Recorder 錄制生成的 Python 代碼,自動(dòng)生成的代碼非常累贅,例如點(diǎn)擊“登錄”按鈕的代碼如下所示:

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 選擇器路徑太長(zhǎng),選擇方式?jīng)]有那么科學(xué),獲取元素時(shí)也沒有設(shè)置等待,很可能會(huì)有超時(shí)異常。所以我們修改一下,將其修改為通過 ID 查找元素,設(shè)置延時(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')

一定要重新連接手機(jī),再運(yùn)行此代碼,這時(shí)即可觀察到手機(jī)上首先彈出了微信歡迎頁面,然后模擬點(diǎn)擊登錄按鈕、輸入手機(jī)號(hào),操作完成。這樣我們就成功使用 Python 代碼實(shí)現(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,一般來說我們我們配置幾個(gè)基本參數(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)

這里配置了啟動(dòng)微信 App 的 Desired Capabilities,這樣 Appnium 就會(huì)自動(dòng)查找手機(jī)上的包名和入口類,然后將其啟動(dòng)。包名和入口類的名稱可以在安裝包中的 AndroidManifest.xml 文件獲取。

如果要打開的 App 沒有事先在手機(jī)上安裝,我們可以直接指定 App 參數(shù)為安裝包所在路徑,這樣程序啟動(dòng)時(shí)就會(huì)自動(dòng)向手機(jī)安裝并啟動(dòng) 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)

程序啟動(dòng)的時(shí)候就會(huì)尋找 PC 當(dāng)前路徑下的 APK 安裝包,然后將其安裝到手機(jī)中并啟動(dòng)。

查找元素

我們可以使用 Selenium 中通用的查找方法來實(shí)現(xiàn)元素的查找,如下所示:

el = driver.find_element_by_id('com.tencent.mm:id/cjk')

在 Selenium 中,其他查找元素的方法同樣適用,在此不再贅述。

在 Android 平臺(tái)上,我們還可以使用 UIAutomator 來進(jìn)行元素選擇,如下所示:

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 平臺(tái)上,我們可以使用 UIAutomation 來進(jìn)行元素選擇,如下所示:

el = self.driver.find_element_by_ios_uiautomation('.elements()[0]')
els = self.driver.find_elements_by_ios_uiautomation('.elements()')

還可以使用 iOS Predicates 來進(jìn)行元素選擇,如下所示:

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 來進(jìn)行選擇,如下所示:

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ū)動(dòng),具體可以參考:https://github.com/appium/appium-xcuitest–driver。

點(diǎn)擊

點(diǎn)擊可以使用 tap() 方法,該方法可以模擬手指點(diǎn)擊(最多五個(gè)手指),可設(shè)置按時(shí)長(zhǎng)短(毫秒),代碼如下所示:

tap(self, positions, duration=None)

參數(shù):

positions,點(diǎn)擊的位置組成的列表。

duration,點(diǎn)擊持續(xù)時(shí)間。

實(shí)例如下:

driver.tap([(100, 20), (100, 60), (100, 100)], 500)

這樣就可以模擬點(diǎn)擊屏幕的某幾個(gè)點(diǎn)。

另外對(duì)于某個(gè)元素如按鈕來說,我們可以直接調(diào)用 cilck() 方法實(shí)現(xiàn)模擬點(diǎn)擊,實(shí)例如下所示:

button = find_element_by_id('com.tencent.mm:id/btn')
button.click()

這樣獲取元素之后,然后調(diào)用 click() 方法即可實(shí)現(xiàn)該元素的模擬點(diǎn)擊。

屏幕拖動(dòng)

可以使用 scroll() 方法模擬屏幕滾動(dòng),用法如下所示:

scroll(self, origin_el, destination_el)

可以實(shí)現(xiàn)從元素 origin_el 滾動(dòng)至元素 destination_el。

參數(shù):

original_el,被操作的元素

destination_el,目標(biāo)元素

實(shí)例如下:

driver.scroll(el1,el2)

我們還可以使用 swipe() 模擬從 A 點(diǎn)滑動(dòng)到 B 點(diǎn),用法如下:

swipe(self, start_x, start_y, end_x, end_y, duration=None)

參數(shù):

start_x,開始位置的橫坐標(biāo)

start_y,開始位置的縱坐標(biāo)

end_x,終止位置的橫坐標(biāo)

end_y,終止位置的縱坐標(biāo)

duration,持續(xù)時(shí)間,毫秒

實(shí)例如下:

driver.swipe(100, 100, 100, 400, 5000)

這樣可以實(shí)現(xiàn)在 5s 由 (100, 100) 滑動(dòng)到 (100, 400)。

另外可以使用 flick() 方法模擬從 A 點(diǎn)快速滑動(dòng)到 B 點(diǎn),用法如下:

flick(self, start_x, start_y, end_x, end_y)

參數(shù):

start_x,開始位置的橫坐標(biāo)

start_y,開始位置的縱坐標(biāo)

end_x,終止位置的橫坐標(biāo)

end_y,終止位置的縱坐標(biāo)

實(shí)例如下:

driver.flick(100, 100, 100, 400)

拖拽

可以使用 drag_and_drop() 實(shí)現(xiàn)某個(gè)元素拖動(dòng)到另一個(gè)目標(biāo)元素上。

用法如下:

drag_and_drop(self, origin_el, destination_el)

可以實(shí)現(xiàn)元素 origin_el 拖拽至元素 destination_el。

參數(shù):

original_el,被拖拽的元素

destination_el,目標(biāo)元素

實(shí)例如下所示:

driver.drag_and_drop(el1, el2)

文本輸入

可以使用 set_text() 方法實(shí)現(xiàn)文本輸入,如下所示:

el = find_element_by_id('com.tencent.mm:id/cjk')
el.set_text('Hello')

我們選中一個(gè)文本框元素之后,然后調(diào)用 set_text() 方法即可實(shí)現(xiàn)文本輸入。

動(dòng)作鏈

與 Selenium 中的 ActionChains 類似,Appium 中的 TouchAction 可支持的方法有 tap()、press()、long_press()、release()、move_to()、wait()、cancel() 等,實(shí)例如下所示:

el = self.driver.find_element_by_accessibility_id('Animation')
action = TouchAction(self.driver)
action.tap(el).perform()

首先選中一個(gè)元素,然后利用 TouchAction 實(shí)現(xiàn)點(diǎn)擊操作。

如果想要實(shí)現(xiàn)拖動(dòng)操作,可以用如下方式:

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)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章題目:Python3爬蟲中Appium的用法
URL標(biāo)題:http://sd-ha.com/article32/gpgdsc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、軟件開發(fā)品牌網(wǎng)站制作、App設(shè)計(jì)Google、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)