ce
安装node.js :是JavaScript运行环境
安装.NET framework : 是微软的开发程序的框架
安装vc_redist:VisualC++的运行库
安装jdk并配置环境变量
安装Python
安装Appium : https://github.com/appium/appium-desktop/releases/tag/v1.15.1
安装Appium Python Client
Appium Client 是配合原生的WebDriver来使用的
pip install Appium-Python-Client
利用命令pip list查看安装列表查找是否已经安装上
导包 : from appium import webdriver
设置desired_capabilities
创建字典 : desired_caps = {}
指定设备信息
# 指定移动平台操作系统
desired_caps["platformName"] = "Android"
# 指定操作系统版本
desired_caps["platformVersion"] = "8.0.0"
# 指定设备 可通过adb device查看
desired_caps["deviceName"] = "62963179"
# 指定需要测试的app的程序包名
desired_caps["appPackage"] = "com.miui.calculator"
# 指定启动页面的名字
desired_caps["appActivity"] ="cal.CalculatorActivity"
'''
查看app启动页Activity
1. 使用adb shell 命令进入Android端shell命令界面
2. 执行命令 : dumpsys package 包名
在前几行找到带有Activity的一串即为启动页面
'''
首先打开appium服务
启动app
driver=webdriver.Remote("http://localhost:4723/wd/hub",desired_caps)
appium保存能力
{
"platformName":"Android",
"platformVersion":"8.0.0",
"deviceName":"62963179",
"appPackage":"com.miui.calculator",
"appActivity":"cal.CalculatorActivity"
}
操作元素
driver.find_element_by_id("xxx").click() #定位元素并点击
指定每次运行测试前不重新安装被测试app
desired_caps["noReset] = True
简单测试miui的计算器
# 导包
from appium import webdriver
import time
# 设置desired_capablities 字典
desired_caps = {}
# 指定移动平台操作系统
desired_caps["platformName"] = "Android"
# 指定操作系统版本
desired_caps["platformVersion"] = "8.0.0"
# 指定设备 可通过adb device查看
desired_caps["deviceName"] = "62963179"
# 指定需要测试的app的程序包名
desired_caps["appPackage"] = "com.miui.calculator"
# 指定启动页面的名字
desired_caps["appActivity"] ="cal.CalculatorActivity"
# 指定每次运存测试前重新安装测试的app
desired_caps['noReset'] = True
'''
查看app启动页Activity
1. 使用adb shell 命令进入Android端shell命令界面
2. 执行命令 : dumpsys package 包名
在前几行找到带有Activity的一串即为启动页面
'''
# 启动app
driver = webdriver.Remote("http://localhost:4723/wd/hub",desired_caps)
# 操作元素 (自动完成2+5的操作)
driver.find_element_by_id("com.miui.calculator:id/btn_2_s").click() # 点击事件
driver.find_element_by_id("com.miui.calculator:id/btn_plus_s").click() # 点击事件
driver.find_element_by_id("com.miui.calculator:id/btn_5_s").click() # 点击事件
# driver.find_element_by_xpath('//android.widget.ImageView[@content-desc="等于"]').click() # 点击事件
# 回车代替等号
driver.press_keycode(66)
time.sleep(5)
# 退出app
driver.quit()
键盘输入数据 - send_keys(),clear()-清空
driver.page_source # 获取网页源数据
from appium import webdriver
import time
desired_caps = {}
desired_caps["platformName"] = "Android"
desired_caps["platformVersion"] = "8.0.0"
desired_caps["deviceName"] = "62963179"
desired_caps["appPackage"] = "com.android.browser"
desired_caps["appActivity"] ="BrowserActivity"
# 指定每次运存测试前重新安装测试的app
desired_caps['noReset'] = True
# 启动app
driver = webdriver.Remote("http://localhost:4723/wd/hub",desired_caps)
# 操作元素 (用浏览器搜索"appium"关键字)
driver.find_element_by_id("com.android.browser:id/search_hint").click()
driver.find_element_by_id("com.android.browser:id/url").send_keys("appium")
# 回车代替等号
driver.press_keycode(66)
time.sleep(5)
# 退出app
driver.quit()
若不能输入中文,用一下设置
desired_caps['UnicodeKeyboard']=True
desired_caps['resetKeyboard']=True
driver.find_element_by_id("com.android.browser:id/url").send_keys(u"appium")
# 导包
from appium import webdriver
import time
# 设置desired_capablities 字典
desired_caps = {}
# 指定移动平台操作系统
desired_caps["platformName"] = "Android"
# 指定操作系统版本
desired_caps["platformVersion"] = "8.0.0"
# 指定设备 可通过adb device查看
desired_caps["deviceName"] = "62963179"
# 指定需要测试的app的程序包名
desired_caps["appPackage"] = "com.miui.calculator"
# 指定启动页面的名字
desired_caps["appActivity"] ="cal.CalculatorActivity"
# 指定每次运存测试前重新安装测试的app
desired_caps['noReset'] = True
'''
查看app启动页Activity
1. 使用adb shell 命令进入Android端shell命令界面
2. 执行命令 : dumpsys package 包名
在前几行找到带有Activity的一串即为启动页面
'''
# 启动app
driver = webdriver.Remote("http://localhost:4723/wd/hub",desired_caps)
# 操作元素 (自动完成2+5的操作)
driver.find_element_by_id("com.miui.calculator:id/btn_2_s").click() # 点击事件
driver.find_element_by_id("com.miui.calculator:id/btn_plus_s").click() # 点击事件
driver.find_element_by_id("com.miui.calculator:id/btn_5_s").click() # 点击事件
# driver.find_element_by_xpath('//android.widget.ImageView[@content-desc="等于"]').click() # 点击事件
# 回车代替等号
driver.press_keycode(66)
# 断言
result = driver.find_element_by_id("com.miui.calculator:id/result").text
print(result)
if result=="= 7":
print("通过")
else:
print("失败")
time.sleep(5)
# 退出app
# driver.quit()
安装pandas
pip install pandas
获得数据
import pandas
data = pandas.read_excel("test.xlsx", sheet_name=0, names=["数值1", "运算符", "数值2", "预期结果"],
dtype={"数值1": str, "运算符": str, "数值2": str, "预期结果": str},header=None)
datalist = data.values.tolist() # 将数据转换为二维列表
导包 :
from appium import webdriver
from time import sleep
import unittest
创建全局变量 driver
driver=None
放在类之外创建测试类
class 类名(unittest.TestCase)
创建初始化和还原环境的函数
@classmethod
def setUpClass(cls):
# 所有测试函数运行前运行一次
device = {}
device={}
device['deviceName']='192.168.120.102:5555'
device['platformName']='Android'
device['platformVersion']='9'
device['noReset']=True
device['appPackage']='com.android.quicksearchbox'
device['appActivity']='com.android.quicksearchbox.SearchActivity'
device['unicodeKeyboard']= True
device['resetKeyboard']=True
global driver # 需要声明全局变量
@classmethod
def tearDownClass(cls):
所有测试幻术运行完后运行一次
# 关闭app
driver.quit()
测试函数
def test函数名(self): # 函数名必须以test开头
u"测试描述" # 省略此行时显示函数名
global driver
测试代码
# 多个测试函数按照函数名的ASSCII顺序执行
运行测试
if __name__ == '__main__':
unittest.main(verbosity=2)
# verbosity=2 表示显示每个用例的详细信息,可以省略,但测试结果不详细
测试结果
测试结果
.:代表测试通过。
F:代表测试失败,F 代表 failure。
E:代表测试出错,E 代表 error。
s:代表跳过该测试,s 代表 skip。
百度搜索测试示例
from appium import webdriver
from time import sleep
import unittest
driver = None
class Webapp(unittest.TestCase):
# 创建初始化和还原环境的函数
@classmethod
def setUpClass(cls):
# 所有测试函数运行前运行一次
# 指定设备信息
device = {}
device["deviceName"] = "emulator-5554"
device["platformName"] = "Android"
device["platformVersion"] = "7"
device["appPackage"] = "com.android.browser"
device["appActivity"] = "BrowserActivity"
device["noReset"] = True
global driver
driver = webdriver.Remote("http://localhost:4723/wd/hub", device)
@classmethod
def tearDownClass(cls):
# 所有测试函数运存完后运行一次
# 关闭app
global driver
driver.quit()
# 测试函数
def testBaidu(self):
# 操作元素
u"测试百度搜索"
global driver
driver.find_element_by_id("com.android.browser:id/url").clear()
driver.find_element_by_id("com.android.browser:id/url").click()
driver.find_element_by_id("com.android.browser:id/url").send_keys("https://www.baidu.com")
driver.press_keycode(66)
sleep(1)
driver.find_element_by_xpath(
'/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View[1]/android.view.View/android.view.View[2]/android.view.View[3]/android.widget.EditText').send_keys(
"Python学习")
driver.find_element_by_xpath(
'/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.LinearLayout/android.widget.FrameLayout/android.webkit.WebView/android.webkit.WebView/android.view.View/android.view.View[1]/android.view.View/android.view.View[2]/android.view.View[3]/android.widget.EditText').click()
driver.press_keycode(66)
sleep(3)
if __name__ == '__main__':
unittest.main(verbosity=2)
设定断言方式一 :
assert str1 in str2,断言失败时的消息文本
设定断言方式二 :
assert 表达式 1==表达式 2
设置断言方式三 :
self.assertIn(str1,str2) # 断言 str1 是否在 str2 中
设置断言方式四 :
self.assertEqual(实际,预期)
WebApp 中的断言:
driver.page_source # 获得网页返回结果/所有页面元素
安装 nose_parameterized : pip install nose_parameterized
导入包parameterized
import parameterized
定义参数
将参数放在了列表中
data = [
[数据11,数据12],
[数据21,数据22],
...
]
引用参数
@parameterized.parameterized.expand(data): # data的数据一行一行获取
def test函数名(self,参数1,参数2,...):
导包 : import HTMLTestRunner
创建测试套件
suit = unittest.TestSuite()
tests = unittest.defaultTestLoader.discover("测试模块的目录, pattern="test_*.py")
# pattern="test_*.py" 指的是目录下所有test_开头的py文件都运存并生成测试报告
suite.addTest(tests)
运行测试报告,保存报告
now = time.strftime("%Y%m%d %H%M%S", time.localtime()) # 获取当前时间并设置格式
reportFile = "./" + now + "_result.html" # 生成报告的路径及文件名
fp = open(reportFile, "w",encoding="utf-8")
runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title="功能测试", description="报告说明与描述,")
runner.run(suite)
fp.close()
安装 Genymotion-ARM-Translation
Genymotion 是一款基于 x86 架构的 Android 模拟器,而大部分应用是 arm 架构,所以
两者不兼容。
对于 x86 的真机,X86 处理器已经能够基本兼容 ARM 了指令。
对于 Genymotion 模拟器,则通过安装 Genymotion-ARM-Translation 来进行兼容。
genymotion 使用 Genymotion-ARM-Translation.zip 文件是不通用的,每个 Android 版本
对应 ARM 指令集的版本也是不一样。
1. 将文件复制到模拟器
adb push Genymotion_ARM_Translation.zip /sdcard/Download
2. 将 Genymotion-ARM-Translation.zip 继续拖动到模拟器中
3. 重启模拟器 :adb reboot
4. 如果拖动没安装成功,可以使用下面的命令安装
adb shell
cd /sdcard/Download/
sh /system/bin/flash-archive.sh /sdcard/Download/Genymotion_ARM_Translation.zip
安装apk
adb install apk文件名
操作app权限弹窗
显示当前app的包名及界面的Activity
adb shell dumpsys window w | findstr \/ | findstr name=
toast=('xpath','//*[contains(@text,"ALLOW")]')
查找 xpath 路径,标记任意,text 属性中包括 ALLOW
id 有时候会发生变化
t=WebDriverWait(driver,10,0.1).until(expected_conditions.presence_of_element_located(toa
st))
寻找指定的 toast 元素
最大超时时间 10s,默认 30s,间隔查询时间 0.1s,默认 0.5s 查询一次
需要导入包、
from selenium.webdriver.support.ui import WebDriverWait
等待模块
from selenium.webdriver.support import expected_conditions
判断模块
t.click() 单击找到的元素
滑动
获取屏幕分辨率尺寸
width = driver.get_windows_size()['width']
height = driver.get_windows_size()['height']
for i in range(1,7):
driver.swipe(width/2,height*3/4,width/2,height/4,1000)
向上滑,每次间隔 1000ms
判断是否出现指定窗口
第一种 :
if driver.current_activity()=='activity 名称' :
# driver.current_activity():获得当前 activity 名称
适当提前延时
第二种 :
if driver.wait_activity("activity 名称",超时时间)
返回值 :窗口存在是返回 True
其他
device['autoLaunch] = False
有时不想让appium每次都自动启动app, 而是想自己打开activity或者在原来activity基础上继续操作,可以方便使用此项
但是device[‘appPackage’]和device[‘appActivity’]不能省略
启动app
driver.launch_app()
关闭app
driver.close_app()
重置app
driver.reset()
: 清除设置以后启动或重启 App
自己启动 activity
driver.start_activity('包名','Activity页面名')
在已经打开的Activity页面继续操作
查看当前的App类型/上下文
driver.contexts
查看当前的app类型/上下文
driver.current_context
切换到指定app类型/上下文
返回值 :窗口存在是返回 True
其他
device['autoLaunch] = False
有时不想让appium每次都自动启动app, 而是想自己打开activity或者在原来activity基础上继续操作,可以方便使用此项
但是device[‘appPackage’]和device[‘appActivity’]不能省略
启动app
driver.launch_app()
关闭app
driver.close_app()
重置app
driver.reset()
: 清除设置以后启动或重启 App
自己启动 activity
driver.start_activity('包名','Activity页面名')
在已经打开的Activity页面继续操作
查看当前的App类型/上下文
driver.contexts
查看当前的app类型/上下文
driver.current_context
切换到指定app类型/上下文
driver.switch_to.context("app名")