python+selenium实现登录

写在前言:

本文所用项目来源于白月黑羽的白月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()

二、结合pytest

创建一个testcase包,建立一个testlogin.py,把上面的代码放置类中,再进行优化

python+selenium实现登录_第1张图片

 1.将创建初始化对象加入夹具中,减少代码

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()

2.元素的分层

将定位的页面元素进行抽离处理,后续如果元素位置有变化,只需要改一个位置即可,不需要牵一发而动全身的大幅修改

创建一个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()

3.参数化

使用参数化,一个方法就可以执行多条用例而不需要写多个方法去执行

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()

4.断言

当用例执行结束后,怎么判断成功不成功就需要使用断言了。

对执行后的结果进行判断 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"]

python+selenium实现登录_第2张图片

 5.生成报告

可以用pytest-html生成页面报告,也可以使用allure,这里不做过多的探讨

写在最后:

本文所用项目来源于白月黑羽的白月SMS系统:Bysms 系统安装与运行 | 白月黑羽

仅用于selenium自动化登录案例实现,不做其他性质操作。

如有僭越侵权,麻烦您私信联系删除。

内容还有许多可以优化的地方,如分层设计,方法调用等,欢迎大佬指点和教导。

你可能感兴趣的:(python)