pytest 结合selenium 运用案例
登录案例
所属模块:login, 用例编号:C001001, 前置条件:系统中存在账号,
测试步骤:不输入管理员账号 只输入密码,点击登陆
预期结果:提示信息为:用户名不能为空
测试结果:通过。
运行环境 pytest selenium
用例代码 pytest -s 执行:
import pytest
from selenium import webdriver
import time
class Test_错误登录:
def test_C001001(self):
print('\n用例 C001001: 不输入账号登录')
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get('http://test.lemonban.com/ningmengban/app/login/login.html')
# 隐式等待 每隔半秒请求
borwser.implicitly_wait(10)
# 窗口放大
borwser.maximize_window()
# 点击密码框
borwser.find_element_by_id('password').click()
borwser.find_element_by_id('password').send_keys('zzc222736')
time.sleep(2)
# 点击登陆
borwser.find_element_by_id('login-button').click()
time.sleep(2)
tes = borwser.find_element_by_xpath('//*[@id="myform"]/div[4]/p').text
print(tes)
assert tes == '用户名不能为空。'
多条用例
用例2
所属模块:login, 用例编号:C001001, 前置条件:系统中存在账号,
测试步骤:不输入管理员账号 只输入密码,点击登陆
预期结果:提示信息为:密码不能为空。
只可在上一个登陆类下面添加方法即可
如果不用执行前面的测试用例 可以指定用例执行:pytest -k 用例函数名或者包含的数值
例如:pytest -s -k 002
def test_C001002(self):
print('\n用例 C001002: 正确的账号不输入密码')
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get('http://test.lemonban.com/ningmengban/app/login/login.html')
# 隐式等待 每隔半秒请求
borwser.implicitly_wait(10)
# 窗口放大
borwser.maximize_window()
# 点击账号框
borwser.find_element_by_id('username').click()
borwser.find_element_by_id('username').send_keys('13409222222')
time.sleep(2)
# 点击登陆
borwser.find_element_by_id('login-button').click()
time.sleep(2)
tes = borwser.find_element_by_xpath('//*[@id="myform"]/div[4]/p').text
print(tes)
assert tes == '密码不能为空。'
验证alert弹框内容
定位内容方法: .switch_to.alert.text
点击确定方法:.accept()
点击取消方法:.dismiss()
弹窗输入方法:.send_keys(keysToSend)
执行用例 pytest -s -k 003:
def test_C001003(self):
print('\n用例 C001003: 错误的账号正确的密码')
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get('http://test.lemonban.com/ningmengban/app/login/login.html')
# 隐式等待 每隔半秒请求
borwser.implicitly_wait(10)
# 窗口放大
borwser.maximize_window()
# 点击账号框
borwser.find_element_by_id('username').click()
borwser.find_element_by_id('username').send_keys('13409222222')
borwser.find_element_by_id('password').click()
borwser.find_element_by_id('password').send_keys('zzc222736')
time.sleep(2)
# 点击登陆
borwser.find_element_by_id('login-button').click()
time.sleep(2)
alertText = borwser.switch_to.alert.text
print(alertText+'+打印效果')
assert alertText == '该手机号没有注册'
封装调用重复代码 减去代码量
有时候有些用例会出现大量的重复 比如说有许多用例需要登录
不可能每条用例都写一遍登录逻辑,或者网页源码出现改动那么我就需要修改自动化代码
所以为了减去代码量可以使用封装调用重复的代码
可以在自动化项目中创建一个目录专门存放重复代码,以用来调用。
写完公共逻辑代码 就可以到自动化文件中引入过来 进行传值
公共逻辑代码文件 进行接收
from selenium import webdriver
def loginAndCheck(username,password):
# 实例化浏览器 如果为空就是是用的项目根目录的Chrome驱动
borwser = webdriver.Chrome()
# 请求网址
borwser.get('http://test.lemonban.com/ningmengban/app/login/login.html')
# 隐式等待 每隔半秒请求
borwser.implicitly_wait(10)
# 窗口放大
borwser.maximize_window()
# 对传过来的值进行判断,如果有值就进行引用
if username is not None:
borwser.find_element_by_id('username').click()
borwser.find_element_by_id('username').send_keys(username)
if password is not None:
borwser.find_element_by_id('password').click()
borwser.find_element_by_id('password').send_keys(password)
# 点击登陆
borwser.find_element_by_id('login-button').click()
alertText = borwser.switch_to.alert.text
print(alertText + '+打印效果')
# 执行完毕退出
borwser.quit()
# 返回弹框值
return alertText
接下来 自动化脚本就可以得到简化
# 引入公共逻辑代码的脚本
from lib.webui import loginAndCheck
class Test_错误登录:
def test_C001003(self):
print('\n用例 C001003: 错误的账号正确的密码')
# 对返回值进行接收 并传值
alertText = loginAndCheck(None,'88888888')
# 对返回值进行判断
assert alertText == '该手机号没有注册'
注意!!! 然后运行的时候 路径是在自动化脚本的路径程序是找不到你的公共逻辑脚本的路径的
所以:要cd到涵盖了 lib目录和 自动化脚本的目录里去 以模块去运行:python -m pytest cases -sv
目录结构: