Appium+python实现微信小程序自动化的实践与探索,Appium+python实现APP自动化也同样适用
Appium+python实现微信小程序自动化的实践与探索
关于这个呢,可以哒,真的可以哒,现在小程序自动化的工具不多,这个可用。
但是,我还是希望大家和我一起研究一下,微信小程序自动化框架:Minium + 微信开发者工具 (一),大家可以去我的首页找下相关文章,毕竟是微信自己的开发的工具,怎么说呢,微信的亲儿子吧。
1.Appium的安装
Appium是开源的自动化测试框架,主要用于iOS,Android以及Windows apps等移动平台的自动化测试。
新版的Appium做了优化,安装比以前简单很多了。
首先呢,环境依赖安装好
1.安装JDK:在JAVA官网http://www.oracle.com/technetwork/java/javase/downloads/index.html下载JDK的安装包,推荐8版本以上的。
2.安装SDK:双击SDK的安装文件,使用默认值一路下一步,直到完成安装,配置好adb环境变量,这个环境变量应该不用教吧,自行百度;确保OK运行adb如下,不然运行appium会报错的,兄弟。
连接真机后,运行adb devices,要找到自己的设备哦,运行显示如下:如果找不到,手机要打开调试;
3.下面安装Appium桌面版本appium-desktop-Setup-1.2.1.exe ,找不到资源的小伙伴,在我的首页资源里面也有。
安装完成后打开,点击start。然后点击长得像搜索的控件,我们先看下是不是OK的。
填入参数如下,什么手机版本,信息啊,devicename就是刚刚adb devices运行得到的设备id:
{
"platformName": "Android",
"platformVersion": "9",
"deviceName": "a57c5aae",
"appPackage": "com.tencent.mm",
"appActivity": "com.tencent.mm.ui.LauncherUI",
"udid": "a57c5aae",
"noReset": true,
"automationName": "uiautomator2"
}
点击startsession,如果一切OK的话那么,手机提示安装一些东西,记得点击允许哦。
可以得到手机的画面,并且启动了微信。一切OK,环境没有问题。
2.安装python以及依赖Appium-python-Client
官网下载安装最新的python,并且添加环境变量;
添加pip环境变量
CMD执行pip install Appium-python-Client
这个简单理解就是python和appium连接的工具啦
安装完成后,我们就可以通过python脚本来控制appium啦;
3.测试脚本的编写
上面我们打开的这个窗口就可以关闭啦,上面的说明appium和手机连接没有问题;现在我们通过python脚本连接appium再连接手机是不是很简单;
这个窗口记得保留,别把服务都关了,还玩个毛线啊
测试用例以及脚本使用工具PyCharm,是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。
我们先看一个简单的例子,连接手机,打开微信,点击进入小程序,点击登录按钮...............:
# -*- coding:utf-8 -*-
# Author:Jin Fei
# -*- coding:utf-8 -*-
# Author:Jin Fei
import unittest
from appium import webdriver
import time,os
from Mini.Function.common import *
class MyTests(unittest.TestCase):
# 测试开始前执行的方法,测试开始前的准备
def setUp(self):
desired_caps = {
'platformName': 'Android',
'platformVersion': '9',
'deviceName': 'a57c5aae',
'appPackage': 'com.tencent.mm',
'appActivity': 'com.tencent.mm.ui.LauncherUI',
'automationName': 'Uiautomator2',
# 'udid': 'a57c5aae',
# 'resetKeyboard': True,
'noReset': True,
"automationName": "uiautomator2"
}
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 连接Appium
self.driver.implicitly_wait(8)
def test001_miniprogram_login(self, t=500):
"""登录并进入家电列表页面"""
time.sleep(3)
window = self.driver.get_window_size()
x1 = window['width'] * 0.5 # 起始x坐标
y1 = window['height'] * 0.2 # y1坐标,滑动起始点
y2 = window['height'] * 0.7 # y2坐标,滑动末尾点
self.driver.swipe(x1,y1,x1,y2,t) # 页面下拉
time.sleep(2)
self.driver.find_element_by_id('com.tencent.mm:id/ka').click() # 点击进入小程序
time.sleep(2)
add_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.webkit.WebView/android.widget.Button/android.view.View[3]/android.view.View[3]"
self.driver.find_element_by_xpath(add_xpath).click()
time.sleep(2)
login1_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.webkit.WebView/android.view.View[2]/android.view.View[2]/android.view.View"
self.driver.find_element_by_xpath(login1_xpath).click()
time.sleep(2)
inputbox_account_xpath = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[3]/android.widget.RelativeLayout/android.widget.FrameLayout[2]/android.widget.FrameLayout/android.widget.FrameLayout[1]/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.webkit.WebView/android.view.View[2]/android.view.View[1]/android.view.View/android.view.View/android.view.View/android.view.View"
self.driver.find_element_by_xpath(inputbox_account_xpath).click()
time.sleep(2)
#点开数字键盘
self.driver.tap([(230, 2023),(230, 2023)],100)
time.sleep(2)
# 测试结束后执行的方法
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
4.我这边先解释一下我的目录和路径
当前小程序测试脚本路径如下:
- 自定义函数Function如下:
# -*- coding:utf-8 -*-
# Author:Jin Fei
import unittest
from appium import webdriver
import time,os
class Function:
def isElementExist(self,element):
#判断元素
flag=True
driver=self.driver
try:
driver.find_element_by_xpath(element)
return flag
except:
flag=False
return flag
- Case如下,代码上面有例子:
- Run脚本集结case运行并生成报告:前辈们写的HTMLTestRunner脚本太长了,我重新起了一个博客里面直接复制作为第三方模块使用。
# -*- coding:utf-8 -*-
# Author:Jin Fei
import unittest,time
import os
import sys
sys.path.append(os.path.abspath(os.path.dirname(os.getcwd())))
from Mini.packages.HTMLTestRunner import HTMLTestRunner
test_dir = '../case'
discover = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py')
if __name__ == '__main__':
now = time.strftime("%Y-%M-%D %H_%M_%S")
filename = 'result.html'
fp = open(filename,'wb')
runner = HTMLTestRunner(stream=fp,
title='Test report Mini',
description='用例执行情况:')
runner.run(discover)
fp.close()
4.测试报告
- 测试报告是html的格式,summary格式如下,测试报告生成的话需要下载一个模块HTML TestRunner