【pytest、playwright】构建POM项目,以及解决登录问题,allure环境问题

目录

前言

1、文件目录

2、安装依赖

3、POM项目实战-案例:打开指定页面

目录结构:

pages中的代码:

cases中的代码:

4、解决登录问题 

问题: 

解决方案:

获取登录的用户信息(cookie):

将用户信息(cookie)填充到context上下文中

3、生成测试报告Allure

下载配置

生成测试报告: 


前言

  • python3.8
  • jdk1.8【使用allure生成测试报告时需要使用】【jdk的配置,市面上很多,我就不说了哈】
  • 创建一个普通的python项目即可
  • 项目模式:pom.---> 先在pages中封装页面,再在cases中写用例

1、文件目录

先创建一个py项目,建立一下目录:

目录说明:

  • auth:保存登录cookies信息
  • cases:测试用例
  • mocks:放置mock的数据todo
  • pages:存放封装的page页面对象
  • plugins:插件
  • conftest.py:本地插件+全局参数
  • pytest.ini:pytest的配置文件,包含base_url、截图、录屏等  

2、安装依赖

例如,我安装的依赖:

pip install playwright
playwright install
pip install pytest-playwright
pip install pytest-base-url
pip install allure-pytest

先安装这些,后面有需要再安装即可

使用命令行,自动生成一个文件:

pip3 freeze >requirements.txt


3、POM项目实战-案例:打开指定页面

pom项目的设计模式就是,先在pages封装登录页面,再去cases写用例

目录结构:

pages中的代码:

from playwright.sync_api import Page
class ExplorePage():
    def __init__(self,page:Page):
        self.page = page
        self.pub = page.locator('.user-icon')

    def gotoURL(self):
        self.page.goto('http://localhost:5173/explore')

代码解读 :

  • __init__函数一般都是元素定位相关的
  • 其他函数,就是点击呀,双击呀,输入呀这类函数的封装,例如上述代码就是进入页面的这个函数封装

cases中的代码:

import time

import pytest
from pages.explore.explore import ExplorePage
from playwright.sync_api import expect
class TestLogin():
    @pytest.fixture(autouse=True)
    def for_each(self,page):
        self.login = ExplorePage(page)
        self.login.gotoURL()
        yield
        print('后置操作')

    def testdemo(self):
        time.sleep(10)
        expect(self.login.pub).to_be_visible()
        print(self.login.pub.count())

代码解读:

  • 第一个函数for_each()顾名思义,就是指在每个case执行之前都会执行。原因是,它是由pytest的fixture装饰器修改的,并且值是autouse=true,这就意味着,这个方法会在每个case执行之前自动调用,而不需要在测试方法中显式调用
  • for_each这个函数,yield之前的部分是在case执行之前运行,yield之后的部分只在case执行结束后运行
  • testdemo这个函数,就是测试方法了,expect函数是playwright提供的函数,根据后面的代码,可知道这一行代码意思是期望xxx元素是可见的,否则会case执行失败
  • count()函数就是获取这个元素在当前页面出现了几次

4、解决登录问题 

问题: 

首先,我们需要明确,要解决的登录问题是什么:

  • 简单的网页 中,可以根据获取各个input框,我们去让代码输入用户名、密码,进而登录。这种实现没有问题,但麻烦在每个case都需要在执行之前先去登陆一次,实在浪费时间
  • 稍微复杂的网页中,在你进行登录时,是没有办法完全依靠自动化实现的,例如会有各种各样的验证码,验证文字等,当然了非要用自动化,也不是完全不可以,但有些复杂,得不偿失了

解决方案

        我们写一个用例,让他登录一次,然后把登陆后的用户验证信息 保存中文件中,在以后的case中,我们只需要获取这个文件内容,把他自动填充到浏览器上下文中即可~【即使是上面的问题2,我们依然可以这么做,因为我们可以在这个方法中打断点,手动登录后再继续运行代码即可】

获取登录的用户信息(cookie):

以下是目录:

代码:

import time

from playwright.sync_api import sync_playwright
def run(playwright) -> None:
    browser = playwright.chromium.launch(channel='chrome', headless=False)
    context = browser.new_context()
    page = context.new_page()
    page.goto('http://localhost:5173/explore')
    time.sleep(10)
    storage = context.storage_state(path="D:/Project/redbook/web-ui/auth/cookie.json")
    context.close()
    browser.close()

with sync_playwright() as playwright:
    run(playwright)

 代码解读:

  • 前面几行就是创建context,以及进入指定页面
  • 我们在操作时,可在time.sleep时间等待打上断点,我们手动登录结束后,再取消断点,继续执行
  • storage这一行,就是通过context上下文,或者到storage_state的内容,并保存到后面路径中指定的文件里

运行结束后,即可看到cookie.json文件中已经有值啦~

将用户信息(cookie)填充到context上下文中

 我们在conftest.py文件中,操作如下:

import pytest


@pytest.fixture(scope='session')
def browser_context_args(browser_context_args, playwright, pytestconfig):
    """
    添加context上下文参数,默认每个页面加载cookie:
    """
    return {
        "storage_state":pytestconfig.rootpath.joinpath('auth/cookie.json'),
        **browser_context_args
    }

 代码解读:

  • session意味着这个fixture将在整个测试回话中只被创建一次
  • 设置context上下文中storage_state中的值:通过pytestconfig获取到根目录,并拼接上括号中的路径中所指的文件内容
  • **browser_context_args: 这是一个解包操作,它将传入的browser_context_args字典的所有键值对添加到返回的字典中。这允许测试人员或fixture用户自定义其他浏览器上下文参数,并将这些参数与storage_state一起返回

3、生成测试报告Allure

下载配置

下载: Central Repository: io/qameta/allure/allure-commandline/2.13.9

找到zip下载:

 

Windows下,直接解压缩,并加到bin目录下,复制路径,打开环境变量:

验证是否成功:

生成测试报告: 

命令1:

pytest --alluredir ./report

先批量把所有case执行一遍

如果说,有的case搜索不到,检查一下文件名是不是text_xxx或xxx_test,否则识别不到

命令2:

allure serve ./report

 生成测试报告,本地的话会自动打开浏览器的,如果失败了,可能是jdk有问题~

也有可能是环境有问题,你以管理员身份打开,再运行就可以了~

运行:

成功后,会自动打开本地浏览器:

 这期先这样啦~

相关推荐

  1. 爬虫基本原理实现以及问题解决

    2024-03-30 13:18:01       21 阅读
  2. HTTPS环境下使用WebSocket问题解决

    2024-03-30 13:18:01       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 13:18:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 13:18:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 13:18:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 13:18:01       20 阅读

热门阅读

  1. 第十六章 Redies

    2024-03-30 13:18:01       18 阅读
  2. Ubuntu安装nginx-http-flv,并获取统计信息

    2024-03-30 13:18:01       19 阅读
  3. 《责任链模式(极简c++)》

    2024-03-30 13:18:01       17 阅读
  4. 使用verilog实现俄罗斯方块游戏

    2024-03-30 13:18:01       17 阅读