如何給網(wǎng)站做宣傳網(wǎng)站注冊(cè)信息查詢(xún)
由于公司的產(chǎn)品坐落于不同的平臺(tái),如ios、mac、Android、windows、web。因此每次有新需求的時(shí)候,開(kāi)發(fā)結(jié)束后,留給測(cè)試的時(shí)間也不多。此外,一些新的功能實(shí)現(xiàn),偶爾會(huì)影響其他的模塊功能正常的使用。
網(wǎng)上的ios自動(dòng)化方面的內(nèi)容也是少之又少。由于本人對(duì)ios自動(dòng)化初次接觸,花了兩天的時(shí)間到處找文章,才逐漸入了門(mén)。本文也是站在小白的角度,從0到1搭建ios自動(dòng)化測(cè)試環(huán)境。
框架選型
查了很多資料,關(guān)于iOS自動(dòng)化的框架有很多。但是支持Python的沒(méi)有幾個(gè)。
如:
UIAutomation 是蘋(píng)果提供的 UI 自動(dòng)化測(cè)試框架,使用 JavaScript 編寫(xiě)。
XCTest 是一個(gè)可以提供各個(gè)層次的測(cè)試的框架,比如單元測(cè)試,自動(dòng)化測(cè)試,性能測(cè)試等。
KIF 使用未公開(kāi)的 Apple API(私有 API),這對(duì)于測(cè)試目的而言是安全的,基于第三方 iOS UI 的單元測(cè)試框架,所以可以做項(xiàng)目的單元測(cè)試,也可以做 UI 集成測(cè)試。但缺點(diǎn)是運(yùn)行較慢。且需要掌握Objective-C 語(yǔ)言。
Frank 是IOS 開(kāi)發(fā)環(huán)境下一款實(shí)現(xiàn)自動(dòng)測(cè)試的工具,Xcode 環(huán)境下開(kāi)發(fā)完成后,通過(guò) Frank 實(shí)現(xiàn)結(jié)構(gòu)化的測(cè)試用例,其底層語(yǔ)言為 Ruby,作為一款開(kāi)源的 iOS 測(cè)試工具,在國(guó)外已經(jīng)有廣泛的應(yīng)用。但是國(guó)內(nèi)相關(guān)資料卻比較少。其最大的優(yōu)點(diǎn)是允許我們用熟悉的自然語(yǔ)言實(shí)現(xiàn)實(shí)際的操作邏輯。
還有一些云測(cè)試平臺(tái),因?yàn)槎际鞘召M(fèi)的,這里也就不說(shuō)了。
綜上所述,appium框架支持多種語(yǔ)言編寫(xiě)自動(dòng)化測(cè)試用例,且我之前使用過(guò)。因此我選擇了它。
appium驅(qū)動(dòng)iOS測(cè)試原理
XCUITest是蘋(píng)果開(kāi)發(fā)的一個(gè)做IOS自動(dòng)化測(cè)試的框架,需要了解些Swift等iOS編程知識(shí);WebDriverAgent是Facebook開(kāi)發(fā)的一個(gè)iOS自動(dòng)化測(cè)試工具,先來(lái)看下面的這張?jiān)韴D:
WDA在Client創(chuàng)建了一個(gè)Server,在手機(jī)端安裝了一個(gè)叫作WebDriverAgentRunner 的一個(gè)應(yīng)用;這個(gè)應(yīng)用會(huì)接收來(lái)自 Server 的指令,并連接底層的XCTest.framwork,讓 XCTest.framwork 調(diào)用蘋(píng)果API來(lái)操作手機(jī)進(jìn)行自動(dòng)化
而appium是把WebDriverAgentRunner 給集成進(jìn)去了,因此實(shí)現(xiàn)了appium的跨平臺(tái)能力
通過(guò)上圖我們了解到 Appium 很粗暴的把整個(gè) WebDriverAgent 直接集成到自己的項(xiàng)目里,然后通信機(jī)制就走 WebDriverAgent,Appium 其實(shí)就提供了一個(gè) Client 端的作用。所以 iOS 9.3 系統(tǒng)之后自動(dòng)化測(cè)試核心是 WebDriverAgent,Appium 就提供了一個(gè) Client 端來(lái)寫(xiě)腳本和發(fā)送指令。
Appium 自動(dòng)化架構(gòu)模式可以用一個(gè)抽象的架構(gòu)表示,就是下面這樣的:
從圖中可以看出:
Client 端是 Appium 之前本身提供的;
Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整個(gè)集成進(jìn)來(lái),Instruments 是為了支持 iOS 9.3 之前的系統(tǒng))
最右邊是一個(gè)手機(jī)
之前 Server 是和 bootstrap.jar 通信,這里 WebDriverAgent 提供了 WebDriverAgentRunner (類(lèi)似 bootstrap.jar 的功能),WebDriverAgent與之通信;
WebDriverAgentRunner 是一個(gè)應(yīng)用,Client 和 server 運(yùn)行了之后,WebDriverAgentRunner 會(huì)被裝到手機(jī)上,這個(gè)應(yīng)用會(huì)接收來(lái)自 Server 的指令,并連接底層的 XCTest.framwork,并告訴 XCTest.framwork 操作手機(jī)進(jìn)行自動(dòng)化。
關(guān)于 WebDriverAgent
實(shí)現(xiàn)了一個(gè) server,通過(guò) server 可以遠(yuǎn)程控制 iOS 設(shè)備:啟動(dòng)應(yīng)用、關(guān)閉應(yīng)用、點(diǎn)擊、滾動(dòng)等操作;
通過(guò)連接 XCTest.framework 調(diào)用蘋(píng)果的 API 執(zhí)行動(dòng)作;
支持多個(gè)設(shè)備同時(shí)進(jìn)行自動(dòng)化;
Appium、Macaca 已經(jīng)集成。
但是 WebDriverAgent 僅僅只提供了一個(gè) server(和 inspect 進(jìn)行元素定位),并沒(méi)有像 Appium 一樣提供 java 或 python 的 Client 端去寫(xiě)腳本,腳本執(zhí)行的時(shí)候發(fā)送指令給 server,然后去運(yùn)行。WebDriverAgent 要求你自己去實(shí)現(xiàn) Client 端,即拿 Java/ Python 的 WebDriver 庫(kù)進(jìn)行封裝,然后發(fā)送指令。所以 WebDriverAgent 其實(shí)就類(lèi)似于 Appium server,就只是一個(gè) server。
環(huán)境搭建
硬件環(huán)境
一臺(tái)Mac、一部iphone(真機(jī)或虛擬機(jī))、一條數(shù)據(jù)線
實(shí)際測(cè)試都是在真機(jī)上完成的,所以整篇文章都以真機(jī)為準(zhǔn)。
自動(dòng)化開(kāi)發(fā)環(huán)境
開(kāi)發(fā)環(huán)境:xcode, Command Line Tools, ,Pycharm, Python3, pip, setuptools
其他環(huán)境:homebrew, node, npm, carthage, appium, python-client, appium-doctor,
xcode,
電腦打開(kāi)App Store搜索即可下載安裝,
Command Line Tools
為了配置appium環(huán)境,我們需要安裝Xcode Command Line Tools。
下載完成后,雙擊已下載的 .dmg 進(jìn)行安裝,檢驗(yàn) Command Line Tools 是否安裝成功。
xcode-select --install # 查看是否安裝
xcode-select: error: command line tools are already installed, use "Software Update" to install updates(錯(cuò)誤:命令行工具已經(jīng)安裝,請(qǐng)使用“軟件更新”安裝更新)
Python,
官網(wǎng)下載一步下一步安裝即可,
pip & setuptools,
下載setuptools
https://pypi.python.org/pypi/setuptools
https://pypi.python.org/pypi/pip
打開(kāi)cmd 進(jìn)入setuptools解壓目錄,輸入:python setup.py install
進(jìn)入pip解壓目錄,輸入:python setup.py install
安裝好后,打開(kāi)終端,輸入pip,如提示不是內(nèi)部命令,則將python安裝目錄下Scripts目錄添加到環(huán)境變量Path中。
Homebrew,
Homebrew是一個(gè)包管理軟件,它可以使我們更容易地安裝其他一些軟件終端輸入安裝:
/usr/bin/ruby -e "$(curl –fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
檢查homebrew是否安裝
brew -v //檢查homebrew是否安裝
brew list //查看已安裝列表
brew update //更新Homebrew
Node & NPM,
安裝
brew install node@14
查看node版本
node -v
配置國(guó)內(nèi)源
npm config set registry https://registry.npm.taobao.org/
Carthage,
Carthage項(xiàng)目依賴(lài)管理, 類(lèi)似于 java 的 maven; 主要是 WebDriverAgent 使用,WebDriverAgent 是用它做項(xiàng)目依賴(lài)的
終端輸入:
brew install carthage
更新carthage : brew upgrade carthage
重新安裝 : brew reinstall carthage
安裝完成后檢查一下是否安裝成功
carthage version
Appium,
安裝appium-server
https://github.com/appium/appium-desktop
Appium-Doctor,
檢查appium安裝是否成功的工具集指令
安裝 appium-doctor
npm install appium-doctor -g
檢查 iOS環(huán)境是否安裝成功
appium-doctor --ios
iOS 真機(jī)調(diào)試環(huán)境配置
webdriverAgent,
在github上下載最新webdriverAgent代碼
https://github.com/appium/WebDriverAgent
下載依賴(lài)(暫時(shí)可跳過(guò),下面操作沒(méi)報(bào)錯(cuò),可忽略)
cd WebDriverAgent
mkdir -p Resources/WebDriverAgent.bundle
sh ./Scripts/build.sh
執(zhí)行完成后,打開(kāi)WebDriverAgent.xcodeproj文件。
配置開(kāi)發(fā)者賬號(hào),所有target建議都配置一遍。
連接并選擇自己的ios設(shè)備
窗口欄-Product-Destination-Device
選擇WebDriverAgentRunner,
窗口欄-Product-Test
如果有這個(gè)報(bào)錯(cuò),前往手機(jī)設(shè)置-通用-描述文件與設(shè)置管理,授信一下APP就OK了。
然后再次運(yùn)行Test,就可以在Xcode控制臺(tái)看到下面的輸出信息:
瀏覽器打開(kāi),訪問(wèn)上面的地址+/status,網(wǎng)頁(yè)返回以下內(nèi)容,說(shuō)明OK了。
有些iphone手機(jī)通過(guò)手機(jī)的IP和端口號(hào)還不能訪問(wèn),此時(shí)需要將手機(jī)的端口轉(zhuǎn)發(fā)到mac上,終端運(yùn)行以下命令
iproxy 8100 8100
將手機(jī)的8100端口,映射到電腦的8100端口上。這樣我們就能通過(guò)訪問(wèn)電腦的8100端口來(lái)訪問(wèn)到手機(jī)了。
網(wǎng)上查到說(shuō)“為了持續(xù)集成”,使用如下方法,在代碼中啟動(dòng)wda,不需要在xcode啟動(dòng)。
desiredCapabilities.setCapability("useNewWDA", true);
這種方法,我暫時(shí)沒(méi)有試過(guò),特此記錄,有空再試。
appium-desktop (server)
打開(kāi)下載的appium desktop
點(diǎn)擊 start server
因?yàn)樾掳姹镜?inspector 和 appium-desktop 分離了,我們需要去github下載inspector。
下載地址
安裝后,打開(kāi)。在 Desired Capabilities 中輸入相關(guān)的參數(shù)后點(diǎn)擊Start Session
{
? "platformName": "ios",
? "appium:deviceName": "我的iPhone",
? "appium:platformVersion": "15.7.1",
? "appium:bundleId": "com.safety.authon",
? "appium:udid": "0a1386121527af8447cb5ac06de1d35cec8ea798"
}
以上信息,可通過(guò)xcode-菜單欄-Window-Devices and Simulator,獲取。
運(yùn)行成功后,會(huì)彈出一個(gè)控制界面,在該界面中可以看到手機(jī)運(yùn)行程序的布局元素。
自動(dòng)化用例編寫(xiě)
打開(kāi)pycharm,新建一個(gè)項(xiàng)目。
安裝依賴(lài),
pip install selenium
pip install Appium-Python-Client
編寫(xiě)自動(dòng)化測(cè)試用例代碼,
#! /usr/bin/env pyhton
# -*- coding:utf-8 -*-
# author:jeff.xie
# datetime:2023/11/22 16:23
# software:PyCharm# iphone app 啟動(dòng)成功實(shí)戰(zhàn)測(cè)試用例from appium import webdriver
from time import sleepfrom appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.common.by import Bydriver = webdriver.Remote(command_executor = 'http://127.0.0.1:4723/wd/hub',
desired_capabilities = {
"platformName": "ios",
"appium:deviceName": "iPhone Jeff",
"appium:platformVersion": "16.5.1",
"appium:bundleId": "welab.bank.mobile.stage",
"appium:udid": "00008030-000A09C81A43802E"
})
sleep(10)ele = driver.find_element(AppiumBy.IOS_PREDICATE,"name == '用戶名稱(chēng)'")
ele.send_keys("qatest101")
driver.find_element(By.ID,"")
sleep(2)# 參考 External Libraries.site-packages.appium.webdriver.common.appiumby
class AppiumBy(By):IOS_PREDICATE = '-ios predicate string'IOS_UIAUTOMATION = '-ios uiautomation'IOS_CLASS_CHAIN = '-ios class chain'ANDROID_UIAUTOMATOR = '-android uiautomator'ANDROID_VIEWTAG = '-android viewtag'ANDROID_DATA_MATCHER = '-android datamatcher'ANDROID_VIEW_MATCHER = '-android viewmatcher'# DeprecatedWINDOWS_UI_AUTOMATION = '-windows uiautomation'ACCESSIBILITY_ID = 'accessibility id'IMAGE = '-image'CUSTOM = '-custom'#參考seleniumclass By:"""Set of supported locator strategies."""ID = "id"XPATH = "xpath"LINK_TEXT = "link text"PARTIAL_LINK_TEXT = "partial link text"NAME = "name"TAG_NAME = "tag name"CLASS_NAME = "class name"CSS_SELECTOR = "css selector"
import unittest
import os
from appium import webdriver
from time ?import sleep
class ?appiumSimpleTezt (unittest.TestCase):
?? ?def ?setUp(self):
?? ??? ?app_path = '/Users/jx/appiumSimpleDemo/build/Release-iphoneos/appiumSimpleDemo.app'
?? ??? ?app = os.path.abspath(app_path)
?? ??? ?self.driver = webdriver.Remote(
?? ??? ??? ?command_executor = 'http://127.0.0.1:4723/wd/hub',
?? ??? ??? ?desired_capabilities = {
? "platformName": "ios",
? "appium:deviceName": "我的iPhone",
? "appium:platformVersion": "15.7.1",
? "appium:bundleId": "com.safety.authon",
? "appium:udid": "0a1386121527af8447cb5ac06de1d35cec8ea798"
}
?? ?def test_push_view(self):
?? ??? ?next_view_button = self.driver.find_element_by_accessibility_id("entry next view")
?? ??? ?next_view_button.click()
?? ??? ?sleep(2)
?? ??? ?back_view_button = self.driver.find_element_by_accessibility_id("Back")
?? ??? ?back_view_button.click()
?? ?def tearDown(self):
?? ??? ?sleep(1)
?? ??? ?# self.driver.quit()
if __name__ == '__main__':
?? ?suite = unittest.TestLoader().loadTestsFromTestCase(appiumSimpleTezt)
?? ?unittest.TextTestRunner(verbosity=2).run(suite)
以上就是ios自動(dòng)化環(huán)境的過(guò)程,記錄下來(lái)。也方便自己回頭來(lái)看,也方便新人學(xué)習(xí)少走彎路。
以上內(nèi)容參考了如下網(wǎng)站:
https://github.com/zhshijie/appiumSimpleDemo
http://appium.io/docs/en/about-appium/getting-started/
https://www.cnblogs.com/crstyl/p/14690895.html
https://github.com/appium/WebDriverAgent
?