Selenium web UI自动化测试框架介绍
Selenium web UI自动化测试框架介绍
Web UI自动化测试使用了unittest框架,内容如下图:

1. case
· 放自动化测试用例
1.1 app(APP与web可以使用同一套测试框架,后续会详细说明)
1.2 web
web下有具体的模块用例,一个模块的case对应一个py文件,如首页模块、购物车模块各自对应一个py文件(如果模块较大,可继续细分为多个小模块,尽量不要让1个py文件行数过多)
TestCase里面的方法主要有3部分
· setUp:初始化
· test方法:具体业务实现
· tearDown:清理/释放(截图、退出)
Unittest框架执行顺序:setUp->test->tearDown
· 每执行1条测试用例之前,都要先执行setUp方法
· 每执行1条测试用例之后,都要再执行tearDown方法
· test里面报错了也会继续走tearDown
· 这三个函数名是unittest框架固定的,不能修改(大小写也不能改)
1). setUp:初始化
def setUp(self): # 初始化
|
# self关键字是类的一个实例化对象(只能用self表示),self.driver就是类的一个变量,这个变量就能被其他方法所认识
# 平常在一个方法中,定义的变量是局部变量,只能被这个方法认识
self.driver = webdriver.Chrome() # 初始化driver
self.driver.get("http://101.133.169.100/yuns/index.php") # 打开项目地址
self.driver.maximize_window() # 窗口最大化
time.sleep(5)
print("starttime:" + time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime(time.time()))) # 打印开始时间
# strftime:格式化时间的一个方法 time.localtime(time.time()):拿到了当前的时间,并将其格式化
|
2). test方法:具体业务实现
- 一个test方法对应一个测试用例
- 包含的使用场景:搜索框中输入搜索内容后,判断返回结果是否包含了搜索的内容,如搜索女装,出现包含“女装”的商品
- 每一条自动化用例都要有一个断言结果

断言方式:
|
def testShouye01_01(self):
'''测试首页导航文案显示是否正常'''
Mylogin(self.driver).login()
firstPageNavi = self.driver.find_element_by_xpath("//div[@class='top']/span") #定位控件
loginText = self.driver.find_element_by_css_selector("div.login>a:nth-child(1)")
regisText = self.driver.find_element_by_css_selector("div.login>a:nth-child(3)")
#断言结果,使用assertEqual判断实际结果与预期结果是否一致
#如果一致,用例pass,如果不一致,直接报错,代码不会再往下继续执行
self.assertEqual("亲,欢迎您来到云商系统商城!",firstPageNavi.text) #判断逗号前后内容是否相等,前后顺序可调换
self.assertEqual("17731990979", loginText.text)
self.assertEqual("退出", regisText.text)
self.assertNotEqual("dd", regisText.text) #assertNotEqual:断言不相等
#assertIn:包含 assertNotIn:不包含
self.assertIn("云商系统商城",firstPageNavi.text) #断言逗号后是否包含逗号前的内容
#如果返回的是true,则assertTrue断言通过,如果返回的是false,则失败
self.assertTrue(self.driver.find_element_by_xpath("//div[@class='top']/span").is_displayed()) #判断控件是否显示出来
self.assertFalse(firstPageNavi.is_displayed()) #判断不存在
#自创断言方式
if loginText.text == "177****0979":
print("等于")
else:
print("不等于")
self.driver.find_element_by_xpath("王麻子") #故意写一个错误语句,不相等时就会报错
|
3). tearDown:清理/释放(截图、退出)
|
def tearDown(self): #释放/清理
filedir = "D:/test/screenshot/"
#如果电脑没有上面的路径,就创建
if not os.path.exists(filedir):os.makedirs(os.path.join('D:/', 'test', 'screenshot'))
#打印结束时间
print("endTime:" + time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())))
screen_name = filedir + time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time())) + ".png"
self.driver.get_screenshot_as_file(screen_name)
#截图,截图名称(唯一化):截图保存路径+截图时间+.png
self.driver.quit() #退出浏览器
|

截图的意义:一条用例执行结果不论是通过还是失败,都需要通过teardown,如果这条用例执行失败、报错,此时截的图就是报错时的页面。截图之前先打印了结束时间,可以通过这个时间找到对应的截图。
2. public
放常用的封装的公用的业务模块,比如登录模块,使用时直接调用
如封装登录模块,代码如下:
|
import time
class Mylogin(object):
def __init__(self, driver): #封装了一个init方法
self.driver = driver #将driver赋值给self.driver
def login(self): #封装登录方法
self.driver.find_element_by_name("username").send_keys("156********")
self.driver.find_element_by_name("password").send_keys("123456")
self.driver.find_element_by_xpath("//div[@class='el-form-item']/div[1]").click()
time.sleep(5)
|
调用方法:
| Mylogin(self.driver).login() |
3. report
放自动化测试报告(执行结果通过/失败),运行testrunner.py后自动生成HTML报告

5. 运行
运行所有py文件:运行时不能以unittests in形式去运行,要以py形式运行。运行后会生成一个html报告。

报告截图如下:

运行后在pycharm里也可看到运行结果:
代表成功 F代表断言失败 E代表定位不到控件


· 如果运行方式不对,可到运行编辑器中设置

浙公网安备 33010602011771号