前提:已配置好yaml应用初始化参数文件和log.conf日志配置文件
定义配置文件cap.yaml,包括key和value,具体内容如下:
platformName: Android
platformVersion: 4.4.2
deviceName: 127.0.0.1:62001
app: apk文件路径
packageName: 包名
appActivity: 主Activity
unicodekeyboard: True
resetkeyboard: True
noReset: False
ip: 127.0.0.1
port: 4723
uiautomationName: uiautomator2
定义日志配置文件logconf,脚本内容如下:
[loggers]
keys=root,main
[logger_root]
level=DEBUG
handlers=consoleHandler,fileHandler
[logger_main]
level=DEBUG
qualname=main
handlers=fileHandler
[handlers]
keys=consoleHandler,fileHandler
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=fmt
args=(sys.stdout,)
[handler_fileHandler]
class=logging.handlers.RotatingFileHandler
level=DEBUG
formatter=fmt
args=('test.log','a')
[formatters]
keys=fmt
[formatter_fmt]
format=%(asctime)s - %(filename)s - %(levelname)s - [line:%(lineno)d] - %(message)s
创建启动app初始化模块:新建desired_caps.py文件,脚本内容如下
from appium import webdriver
import yaml
import logging
import logging.config
#日志配置文件
CON_LOG='log.conf'
logging.config.fileConfig(CON_LOG)
logging=logging.getLogger()
def app_desired():
#读取配置文件的数据
file = open('cap.yaml', 'r')
data = yaml.load(file)
logging.info("Initialize APP...")
desired_caps = {}
desired_caps['platformName'] = data['platformName']
desired_caps['platformVersion'] = data['platformVersion']
# 第一个模拟器默认127.0.0.1:62001 第二个默认:127.0.0.1:62025
desired_caps['deviceName'] = data['deviceName']
desired_caps['app'] = data['app']
desired_caps['packageName'] = data['packageName']
desired_caps['appActivity'] = data['appActivity']
desired_caps['noReset'] = data['noReset']
desired_caps['unicodekeyboard'] = data['unicodekeyboard']
desired_caps['resetkeyboard'] = data['resetkeyboard']
desired_caps['uiautomationName'] = data['uiautomationName']
logging.info("Start APP...")
driver = webdriver.Remote('http://' + str(data['ip']) + ':' + str(data['port']) + '/wd/hub', desired_caps)
driver.implicitly_wait(8)
return driver
#调试当前脚本方法
if __name__ == '__main__':
app_desired()
创建基类,新建baseview.py文件,脚本内容如下:
class BaseView(object):
def __init__(self,driver):
self.driver=driver
#普通元素定位
def find_element(self,*loc):
return self.driver.find_element(*loc)
#元素定位返回一个数组list,一般用于判断元素是否存在
def find_elements(self,*loc):
return self.driver.find_elements(*loc)
#获取屏幕大小
def getsize(self):
return self.driver.getsize()
#滑动屏幕
def swipe(self, star_x,star_y,end_x,end_y,duration):
return self.driver.swipe( star_x,star_y,end_x,end_y,duration)
def time_wait(self,t):
return self.sleep(t)
创建公共类,创建lijitiyan.py文件,脚本内容如下:
#!urs/bin/python
#!_*_ coding:UTF-8 _*_
#从baseView.py文件内导入基类BaseView
from baseView import BaseView
from selenium.common.exceptions import NoSuchElementException
import logging
import time
from selenium.webdriver.common.by import By
#从desired_caps .py文件内导入app_desired
from desired_caps import app_desired
from time import sleep
import os
#定义类
class Common(BaseView):
#定义"流量充值"按钮元素
image_button=(By.ID,"com.mydream.wifi:id/tvAsk")
#定义检测是否已进入首页函数
def check_imagebutton(self):
logging.info("========检测元素========")
try:
element=self.driver.find_element(*self.image_button)
except NoSuchElementException:
logging.info("========元素不存在========")
else:
# element.click()
logging.info("========元素存在========")
def screenshot(self):
logging.info("========屏幕截图========")
self.driver.save_screenshot()
#获取系统当前时间的方法
def getTime(self):
self.now = time.strftime("%T-%m-%d %H_%M_%S")
return self.now
#定义屏幕截图的方法
def getScreenShot(self,module):
time=self.getTime()
image_file=os.path.dirname(os.path.dirname(__file__))+'screenshots/%s_%s.png' %(module,time)
logging.info('get %s screenshot' % module)
self.driver.get_screenshot_as_file(image_file)
if __name__ == '__main__':
#定义driver初始化
driver=app_desired()
com=Common(driver)
com.check_imagebutton()
com.getScreenShot("star APP")
创建登陆模块脚本,创建loginView.py文件,脚本内容如下:
from desired_caps import app_desired
from common_fun import Common
from lijitiyan import Common
from selenium.webdriver.common.by import By
import logging
from time import sleep
class LoginView(Common):
username_type=(By.ID,'com.mydream.wifi:id/cacetMobile')
password_type=(By.ID, 'com.mydream.wifi:id/cacetPwd')
loginBtn=(By.ID, 'com.mydream.wifi:id/cbtnLogin')
weTab=(By.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/'
'android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/'
'android.widget.TabHost/android.widget.LinearLayout/android.widget.TabWidget/android.widget.RelativeLayout[3]')
login_type=(By.ID,'com.mydream.wifi:id/cbtnLogin')
more_type=(By.ID,'com.mydream.wifi:id/title_third_login_button')
def login_action(self,username,password):
self.check_imagebutton()
logging.info("========切换到我的tab页面========")
self.driver.find_element(*self.weTab).click()
logging.info("========进入登录页面========")
self.driver.find_element(*self.login_type).click()
logging.info("========进入账号密码登录页面========")
self.driver.find_element(*self.more_type).click()
logging.info("========输入账号和密码========")
logging.info("账号是: %s" % username)
self.driver.find_element(*self.username_type).send_keys(username)
logging.info("密码是: %s" % password)
self.driver.find_element(*self.password_type).send_keys(password)
logging.info("========开始登录========")
self.driver.find_element(*self.loginBtn).click()
logging.info("========登录成功========")
sleep(5)
self.driver.save_screenshot("login.png")
if __name__ == '__main__':
driver = app_desired()
#logview继承Common,Common继承BaseVIew,BaseVIew要求传入参数
l=LoginView(driver)
l.login_action("18059869253","123456")
创建myunit.py文件,脚本内容如下:
import unittest
import logging
from desired_caps import app_desired
from time import sleep
class StarEnd(unittest.TestCase):
#启动app
def setUp(self):
logging.info("========setUp========")
self.driver=app_desired()
def tearDown(self):
logging.info("========tearDown========")
sleep(5)
self.driver.close_app() #调用退出app的方法
创建test_unit.py,脚本内容如下:
from myunit import StarEnd
from loginView import LoginView #导入已封装好的登陆模块
import unittest
import logging
class TestLogin(StarEnd): #继承myunit.py文件内的StarEnd类
#测试用例必须以test开头
def test_login_01(self):
logging.info("========登录成功========")
l = LoginView(self.driver)
l.login_action("18059869253", "123456")
def test_login_02(self):
logging.info("========登录密码错误========")
l = LoginView(self.driver)
l.login_action("15280265205", "123456")
if __name__ == '__main__':
unittest.main()