发布时间:2023-01-07 23:30
UI 自动化分类
Web 自动化:Selenium
App 自动化:Appium
GUI 自动化:Windows、Mac
微信小程序自动化:App + Web 测试技术的外延形态
自动化测试框架选择
推荐Appium
跨语言:Java、Python、Node.js 等
跨平台:Android、iOS、Windows、Mac
底层多引擎可切换
生态丰富,社区强大(testerHome)
iOS: KIF、WDA、XCTest
Android: Robotium、UI Automator、UI Automator2
特色框架:calabash、Macaca、ATX
- Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具。
- Appium、Appium-desktop、Appium Client 的区别是 Appium 体系的核心,因为它本身也是一个 web 接口服务,所以也会被成为 appium server,对外默认开启包括 4723 等多个端口。
- Appium-Desktop:是为了让 Appium 能够更好用,让小白入门更容易,让调试和界面分析更方便,官方开发了 GUI 的工具 Appium-desktop。
Appium Client:Appium 只是一个 Web 接口,他接受 HTTP 请求,所以各个语言都可以自己封装发送请 求,于是就有 appium 下的各个子项目。以下是各语言对 Appium Client 做的支持。
Appium 的设计理念
- Appium 引擎列表
- npm 方式安装 (官方安装,国际通用,网络不稳定,不建议使用此方式安装)
> brew install node # get node.js > npm install -g appium # get appium- cnpm 方式安装 (推荐)
- npm install -g cnpm --registry=https://registry.npm.taobao.org
- cnpm install -g appium
- pip3 install Appium-Python-Client
注意事项
pip 问题:由于mac系统默认安装了python2.7且pip已经不对python2进行管理,导致pip安装失败。
解决:安装python3,配置path环境变量,否则zsh会报command not found;将本地的python alias python3路径(可参考这里)
安装python IDE,使用pycharm 社区版本即可,专业版需要付费
iOS真机证书问题1:由于appium 是基于WebDriverAgent,找到appium文件下WebDriverAgent位置打开配置即可,appiumdesktop的WebDriverAgent通常是在
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj
iOS真机证书问题2: 如果配置玩证书仍旧提示证书问题,可能是由于WebDriverAgent工程的位置没和appium 对应上,根据server提示的路径(一般是在这里/usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent/WebDriverAgent.xcodeproj)找到WebDriverAgent工程配置即可
常用定位手段
id
Accessibility ID
XPath
元素定位符与复用
findElementByXXX
findElement(by, value)
常见自动化动作支持
click
sendKeys
swipe
touch action
常用的设备交付命令
模拟电话、短信
横竖屏切换
App处理
键盘、粘贴板
录屏
inspector虽然也可以生成用例,可是代码可读性较低,难以维护,为了使用例的可维护行增强,建议使用IDE来编写测试用例
1.配置caps,封装启动过程
# This sample code uses the Appium python client
# pip install Appium-Python-Client
# Then you can paste this into a file and simply run with Python
from datetime import datetime
from time import sleep
import pytest
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webdriver import WebDriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from pageObject.TLMainPage import TLMainPage
class App:
driver: WebDriver = None
@classmethod
def start(cls):
caps = {}
caps["platformName"] = "ios"
caps["automationName"] = "xcuitest"
caps["deviceName"] = "iPhone 8P"
caps["udid"] = "5394fc48a76b80e4aff8adacbb1256bc809a6b58"
caps["xcodeOrgId"] = "E6YTL27QWA"
caps["xcodeSigningId"] = "iPhone Developer"
caps["app"] = "/Users/chenwuqi/Documents/appium/VSTimeLine.app"
caps["noReset"] = False
caps["autoAcceptAlerts"] = True
cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
cls.driver.implicitly_wait(1)#隐式等待
print("1-------------" + datetime.now().strftime(format("%H:%M:%S")))
def loaded(driver):
print("2-------------" + datetime.now().strftime(format("%H:%M:%S")))
if len(cls.driver.find_elements_by_id("btn skip@3x")) >= 1:
cls.driver.find_element_by_id("btn skip@3x").click()
return True
else:
return False
try:
WebDriverWait(cls.driver, 40).until(loaded)#显示等待
except:
print("no update")
return TLMainPage(cls.driver)
@classmethod
def quit(cls):
cls.driver.quit()