本文所用项目来源于白月黑羽的白月SMS系统:Bysms 系统安装与运行 | 白月黑羽
仅用于selenium自动化登录案例实现,不做其他性质操作。
如有僭越侵权,麻烦您私信联系删除。
使用python+selenium+pytest实现自动化登录测试案例
# selenium安装
pip install selenium
# pytest安装
# 因为安装的python版本3.7.9安装最新的pytest有问题
# 故选择安装低版本
pip install pytest==5.1.1
不做任何的分层和结合框架,一个步骤一个步骤的实现登录
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome("./chromedriver.exe")
driver.get(url="http://127.0.0.1/mgr/sign.html")
driver.implicitly_wait(10)
driver.find_element(By.ID,"username").send_keys("username")
driver.find_element(By.ID,"password").send_keys("password")
driver.find_element(By.TAG_NAME, "button").click()
driver.quit()
创建一个testcase包,建立一个testlogin.py,把上面的代码放置类中,再进行优化
pytest中是使用conftest作为配置文件,存放pytest.fixtrue夹具内容调用
conftest放在项目根目录下,全局有效;放置xxx目录下,只对该目录有效
# conftest.py中
import time
import pytest
from selenium import webdriver
@pytest.fixture
def driver():
driver = webdriver.Chrome("./chromedriver.exe")
driver.get(url="http://127.0.0.1/mgr/sign.html")
driver.implicitly_wait(10)
yield driver # 返回一个驱动对象
time.sleep(2)
driver.quit()
相当于把def test_login方法中的启动和退出变成了方法的前后置处理,注意yield返回的驱动对象,要在def test_login方法机进行调用,才有效
from selenium.webdriver.common.by import By
class TestLogin:
def test_login(self,driver):
driver.find_element(By.ID, "username").send_keys("username")
driver.find_element(By.ID, "password").send_keys("password")
driver.find_element(By.TAG_NAME, "button").click()
将定位的页面元素进行抽离处理,后续如果元素位置有变化,只需要改一个位置即可,不需要牵一发而动全身的大幅修改
创建一个tools包,新建一个tools_attribute.py,存放元素变量
from selenium.webdriver.common.by import By
class Attribute:
login_username = (By.ID, "username")
login_password = (By.ID, "password")
login_btn = (By.TAG_NAME, "button")
此时,def test_login方法中find_element后边可以直接调用这个类的属性即可
from tools.tools_attribute import Attribute
class TestLogin:
def test_login(self,driver):
driver.find_element(*Attribute.login_username).send_keys("username")
driver.find_element(*Attribute.login_password).send_keys("password")
driver.find_element(*Attribute.login_btn).click()
使用参数化,一个方法就可以执行多条用例而不需要写多个方法去执行
pytest区别于unittest:
unittest使用的是ddt的方式,类装饰器@ddt,方法装饰@data(*传入的数据)
pytest使用@pytest.mark.parametrize(变量名,传入的数据)
(关于pytest参数化放置类或者方法上的区别不做过多的探讨)
以下放置在方法上:
import pytest
from tools.tools_attribute import Attribute
caselist = [
{"username": "byhy", "passwor0d": 12345678, "expect": "登录失败 : 用户名或者密码错误"},
{"username": "byh", "passwor0d": 888888888, "expect": "登录失败 : 用户名或者密码错误"},
{"username": "byhy", "passwor0d": "", "expect": "请输入密码"},
{"username": "", "passwor0d": 12345678, "expect": "请输入用户名"}
]
class TestLogin:
@pytest.mark.parametrize("case",caselist)
def test_login(self,driver,case):
driver.find_element(*Attribute.login_username).send_keys(case["username"])
driver.find_element(*Attribute.login_password).send_keys(case["password"])
driver.find_element(*Attribute.login_btn).click()
当用例执行结束后,怎么判断成功不成功就需要使用断言了。
对执行后的结果进行判断 assert
import pytest
from tools.tools_attribute import Attribute
caselist = [
{"username": "byhy", "passwor0d": 12345678, "expect": "登录失败 : 用户名或者密码错误"},
{"username": "byh", "passwor0d": 888888888, "expect": "登录失败 : 用户名或者密码错误"},
{"username": "byhy", "passwor0d": "", "expect": "请输入密码"},
{"username": "", "passwor0d": 12345678, "expect": "请输入用户名"}
]
class TestLogin:
@pytest.mark.parametrize("case",caselist)
def test_login(self,driver,case):
driver.find_element(*Attribute.login_username).send_keys(case["username"])
driver.find_element(*Attribute.login_password).send_keys(case["password"])
driver.find_element(*Attribute.login_btn).click()
alart_text = driver.switch_to.alert.text
# 这里登录后的消息为弹窗
assert alart_text == case["expect"]
可以用pytest-html生成页面报告,也可以使用allure,这里不做过多的探讨
本文所用项目来源于白月黑羽的白月SMS系统:Bysms 系统安装与运行 | 白月黑羽
仅用于selenium自动化登录案例实现,不做其他性质操作。
如有僭越侵权,麻烦您私信联系删除。
内容还有许多可以优化的地方,如分层设计,方法调用等,欢迎大佬指点和教导。