本测试项目采取PO模型和数据分离式架构,采用selenium+pytest+allure+jenkins结合的方式进行脚本编写与运行
1、项目目录
目前项目使用以下4个文件即可实现,先建立safe文件夹,再依次建立login.py、login.json、login.py、test_login.py四个python文件
2、conf/safe/login.py
此文件用来储存商户前端获取的页面元素
2.1、元素检查
2.2、获取元素
点击“元素选择器”,将鼠标移动至想要获取的元素上,比如“用户名输入框”

点击后,在下面会出现对应的高亮代码

右键高亮代码,复制为Xpath(首选Xpath,如代码运行失败可尝试复制为selector)

在新建的login.py中粘贴至对应位置(注:复制前端元素方式对应代码中By.XPATH还是By.CSS_SELECTOR的方式)

依次类推,将所需前端元素写入文件,完整代码:
# 存放前端HTML的元素
from selenium.webdriver.common.by import By
# 用户名
username = By.CSS_SELECTOR, ("[placeholder='请输入用户名']")
# 密码
password = By.CSS_SELECTOR, ("[placeholder='请输入密码']")
# 登录按钮
login_btn = By.XPATH, ('//*[@id="main"]/div/div/div/div[2]/div[2]/div')
# 拼接小缺口图片
small_pic = By.XPATH, ('//*[@id="main"]/div/div/div/div[4]/div[1]/img[2]')
# 拼接背景图
big_pic = By.XPATH, ('//*[@id="main"]/div/div/div/div[4]/div[1]/img[1]')
# 拼接滑块
picture_btn = By.XPATH, ('//*[@id="main"]/div/div/div/div[4]/div[2]/span[2]')
# 登录后文字
get_word = By.XPATH, ('//*[@id="main"]/div/div[3]/div/div/div[1]/div[2]/h4')
3、data/safe/login.json
此文件为登录网站所需数据,网址、用户名、密码(帐号为网站免费提供试用,切勿进行违规操作),完整代码:
{
"url": "https://store-b2b2c.pickmall.cn/login",
"username": "13011111111",
"password": "111111",
"verify_word": "平台公告"
}
4、page/safe/login.py
此文件书写登录操作,输入帐号、输入密码、点击登录、滑块验证
4.1、PageLogin类
新建PageLogin类(继承Common类),在类中定义page_input_username方法,调用common_input输入账户名;login.username为我们刚刚写好的conf/safe/login.py中的页面元素
此方法的意思是:定义page_input_username 方法,调用common_input 的输入方法,输入元素为login.username ,输入内容为username ;以此类推,将其他登录所需步骤依次写入文件
class PageLogin(Common):
# 输入用户名
def page_input_username(self, username):
self.common_input(login.username, username)
4.2、page_longin() 函数
最后需建立一个综合调用所有步骤的方法
将前面写好的方法按照我们实际操作的顺序逐一调用,且设置一些必要的等待时间,避免元素未加载完成造成测试失败(本代码仅为演示使用,实际生产环境切勿添加过多过长等待)
def page_login(self, username, password):
sleep(2)
self.page_input_username(username)
sleep(1)
self.page_input_password(password)
sleep(2)
self.page_click_login_btn()
sleep(2)
self.page_save_picture()
4.3、完整代码
from time import sleep
from common.common import Common
from conf.sale import login
from tools.make_picture import Make_Picture
from tools.get_log import GetLog
import allure
log = GetLog.get_logger()
# 商城登录类
log.info("商城登录类")
class PageLogin(Common):
# 输入用户名
log.info("输入用户名")
@allure.step('输入用户名')
def page_input_username(self, username):
self.common_input(login.username, username)
# 输入密码
log.info("输入密码")
@allure.step('输入密码')
def page_input_password(self, password):
self.common_input(login.password, password)
# 点击登录
log.info("点击登录")
@allure.step('点击登录')
def page_click_login_btn(self):
self.common_click(login.login_btn)
# 验证滑块
log.info("验证滑块")
@allure.step('验证滑块')
def page_save_picture(self):
# 保存滑动验证图片至本地
lld = self.common_save_picture(login.small_pic, login.big_pic)
sleep(1)
# 计算要滑动的距离
dirt = Make_Picture().Measure_distance(lld[0], lld[1])
sleep(1)
# 拖动滑块完成验证
self.common_hold_mouse(login.picture_btn, dirt, 0)
sleep(1)
# 获取登录成功后文字
log.info("获取登录成功后文字")
@allure.step('获取登录成功后文字')
def page_get_word(self):
return self.common_get_word(login.get_word)
# 综合调用方法
log.info("综合调用方法")
@allure.step('综合调用方法')
def page_login(self, username, password):
sleep(2)
self.page_input_username(username)
sleep(1)
self.page_input_password(password)
sleep(2)
self.page_click_login_btn()
sleep(2)
self.page_save_picture()
5、scripts/safe/test_login.py
此文件为运行代码的入口,初始化浏览器驱动、运行对应page层的项目代码、输出测试报告
5.1、TestLogin类
新建TestLogin类,新建setup_class初始化方法,self.data_json 为初始化json数据,也就是把json中对应的字段传入到test_login.py中来;self.driver为初始化浏览器驱动,也就是调起chrome浏览器的动作;新建teardown_class结束方法, 就是关闭chrome浏览器的动作,防止进程一直被占用,消耗服务器资源
class TestLogin:
# 初始化
def setup_class(self):
# 初始化json数据
pathdir = os.sep+"sale"+os.sep+"login.json"
self.data_json = read_json(pathdir)
# 初始化driver
self.driver = GetDriver().get_driver(self.data_json[0])
# 结束
def teardown_class(self):
self.driver.quit()
5.2、test_login() 函数
新建test_login方法,PageLogin(self.driver).page_login 调用page层中写的综合方法page_login,将json文件中帐号、密码传入,完成登录过程;assert为断言语法,找到登录成功后才会显示的界面中的比较特殊的文字,本文选取的文字是“平台公告”,如断言成功则输出pass脚本结束,如断言失败则抛出AssertionError脚本结束
def test_login(self):
PageLogin(self.driver).page_login(self.data_json[1], self.data_json[2])
# 避免因为错误导致脚本异常中断
try:
# 判断是否登录成功
log.info("断言成功")
assert PageLogin(self.driver).page_get_word() == self.data_json[3]
# 未成功,抛出异常
except Exception as e:
log.info("断言失败")
print("错误信息为:", e)
raise

5.3、完整代码
import os
from tools.get_driver import GetDriver
from tools.read_json import read_json
from page.sale.login import PageLogin
from tools.get_log import GetLog
log = GetLog.get_logger()
import allure
@allure.feature("登录方法类")
class TestLogin:
# 初始化
log.info("初始化")
def setup_class(self):
# 初始化json数据
pathdir = os.sep+"sale"+os.sep+"login.json"
self.data_json = read_json(pathdir)
# 初始化driver
self.driver = GetDriver().get_driver(self.data_json[0])
# 结束
log.info("结束")
def teardown_class(self):
self.driver.quit()
# 调用page层的综合调用方法
log.info("调用page层的综合调用方法")
@allure.title("登录方法")
def test_login(self):
PageLogin(self.driver).page_login(self.data_json[1], self.data_json[2])
# 避免因为错误导致脚本异常中断
try:
# 判断是否登录成功
log.info("断言成功")
assert PageLogin(self.driver).page_get_word() == self.data_json[3]
# 未成功,抛出异常
except Exception as e:
log.info("断言失败")
print("错误信息为:", e)
raise
if __name__ == '__main__':
TestLogin().test_login()
6、至此项目代码结束
---THE END ---
更多内容请关注微信公众号

版权归原作者 大飞记Python 所有, 如有侵权,请联系我们删除。