什么是pytest,什么是fixture
#同步案例,同时运行两个playwright实例-但是在同步的时候,playwright只让同时运行一个,所以要关系一个实例,才能继续运行下一个.
from playwright.sync_api import Page,sync_playwright
def test_baidu():
#pw层,引入一个playwright的一个实例,开启playwright
with sync_playwright()as pw:
#浏览器层,创建一个谷歌浏览器,设置无头
browser=pw.chromium.launch(headless=False)
#然后在设置上下文.浏览器的大小,分辨率等等.
context=browser.new_context()
#page层,定位,打开网址等等操作.
page=context.new_page()
page.goto(url="https://www.baidu.com")
page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
page.locator('//button[@id="chat-submit-button"]').click()
page.wait_for_timeout(2000)
def test_baidua():
#pw层,引入一个playwright的一个实例,开启playwright
with sync_playwright()as pw:
#浏览器层,创建一个谷歌浏览器,设置无头
browser=pw.chromium.launch(headless=False)
#然后在设置上下文.浏览器的大小,分辨率等等.
context=browser.new_context()
#page层,定位,打开网址等等操作.
page=context.new_page()
page.goto(url="https://www.baidu.com")
page.locator('//textarea[@id="chat-textarea"]').fill("myname is pw2")
page.locator('//button[@id="chat-submit-button"]').click()
page.wait_for_timeout(3000)
#因为函数是test开头,所以可以直接运行,函数无需调用就可以运行.
#但是:虽然两个函数都是以test_开头,但可能没有使用测试框架来运行,而是直接运行Python脚本。在直接运行Python脚本的情况下,即使函数以test_开头,也不会自动执行,除非显式调用它们。,所以只会执行你当前选中的函数.
#一共有两种方式运行,
#1\直接点击运行按钮,或者在你想要运行的函数哪里点击测试.
#2\用命令行去运行:
#2\用命令行就可以使用pytest提供了几个大功能,直接点击按钮就没有这个效果,最重要的就是这三个功能
#---另外按钮和测试按钮运行只能执行一个函数,如果两个函数想同时执行,要么调用(引用)函数,在按钮执行,要么就命令行执行.(建议命令行.)
#1\测试用例的发现,他会看到以test开头他会认为是用例,他就需要去跑.
#2\测试用例的执行,以test开头,无需调用函数,他会自己帮你执行这个函数.
#3\运行完成以后,会生成一个简易的报告.
#报告查看方法:
#终端输入:pytest play.py(当前文件名)-回车,就开始跑了,跑完以后,会在终端生成一个报告.
''' 必须通过命令行运行pytest才能看到报告. 报告内容:
Windows PowerShell
版权所有(C) Microsoft Corporation。保留所有权利。
安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows
(.venv) PS E:\playwright> pytest play.py #test session starts已经开始了.
=================================================== test session starts =============
#执行的平台是win32 执行的python版本是多少,和pytest的版本是多少,和其他插件的版本是多少.
platform win32 -- Python 3.13.5, pytest-8.4.2, pluggy-1.6.0
#告诉你当前项目的跟域名是神马.
baseurl: http://www.自动化测试.com
#我们项目的文件位置根目录在哪里,
rootdir: E:\playwright
#他的configfile文件是哪一个.
configfile: pytest.ini
#对应其他插件,base-url的版本,和playwright的版本
plugins: base-url-2.1.0, playwright-0.7.1
#以及一共有多少个测试用例.
collected 2 items
#然后开始跑用例
play.py .. [100%]
#告诉我们两条用例全部通过.用时, 10.16s 秒
============================ 2 passed in 10.16s =========
(.venv) PS E:\playwright>
'''用命令行只执行一个函数(命令默认是同时执行两个函数),不一下子执行两个.
#需要导入pytest: import pytest ,同时需要在你要执行的函数前面加上:@pytest.mark.only
#同步案例,同时运行两个playwright实例-但是在同步的时候,playwright只让同时运行一个,所以要关系一个实例,才能继续运行下一个.
from playwright.sync_api import Page,sync_playwright
import pytest #这个功能需要单独把pytest引入
@pytest.mark.only #同时要在你运行的函数前面加上@pytest.mark.only
def test_baidu():
#pw层,引入一个playwright的一个实例,开启playwright
with sync_playwright()as pw:
#浏览器层,创建一个谷歌浏览器,设置无头
browser=pw.chromium.launch(headless=False)
#然后在设置上下文.浏览器的大小,分辨率等等.
context=browser.new_context()
#page层,定位,打开网址等等操作.
page=context.new_page()
page.goto(url="https://www.baidu.com")
page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
page.locator('//button[@id="chat-submit-button"]').click()
page.wait_for_timeout(2000)
def test_baidua():
#pw层,引入一个playwright的一个实例,开启playwright
with sync_playwright()as pw:
#浏览器层,创建一个谷歌浏览器,设置无头
browser=pw.chromium.launch(headless=False)
#然后在设置上下文.浏览器的大小,分辨率等等.
context=browser.new_context()
#page层,定位,打开网址等等操作.
page=context.new_page()
page.goto(url="https://www.baidu.com")
page.locator('//textarea[@id="chat-textarea"]').fill("myname is pw2")
page.locator('//button[@id="chat-submit-button"]').click()
page.wait_for_timeout(3000)
#然后执行的命令也要改成:pytest -m only play.py什么是fixture:看不懂的话直接看红色文字.
我们平常在函数中可以直接调用的page参数,为什么调用括号里的page参数,就可以直接运行并且使用呢?
因为我的page是从插件里面来的,page参数已经定义好了,我们找到左侧文件夹.venv>lib>site-packages>pytest_playwright.py
点开文件,我们在文件中搜一下,def page 我们就可以看到page参数对应的函数模块.
我们可以看到函数上方有一个@pytest.fixture
这个就是pytest的fixture,就是一个夹具,夹具里面就可以默认去给你返回一个page页,
这个page页,由我们的上下文去创建了一个con.text.new_page()这种方式去创建的,所以参数里面就可以直接用page了.
这里的context,上下文也是由另一个函数创建的,
如果听不懂,我们自己创建一个fixture来用,
我们在自己的案例文件中,创建一个我们自己的fixture,fixture后面的括号可以加上,也可以去掉.
代码如下
from playwright.sync_api import Page,expect
import pytest
@pytest.fixture #创建一个fixture定义一个自己的夹具
def hello_world():
print("hello world")
@pytest.mark.only
def test_baidu(page:Page,hello_world):
page.goto(url="https://www.baidu.com")
#page.wait_for_timeout(5000)
page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
page.locator('//button[@id="chat-submit-button"]').click()
page.wait_for_timeout(10000)我们发现,除了打开浏览器以外,同时还执行了打印helloworld,这样我们就成功的运行了fixture
如果我们想在程序一开始的时候输入hello,在打开浏览器程序结束以后,输入world怎么操作呢?
我们可以使用yield,然后在使用print,详见代码
from playwright.sync_api import Page, expect
import pytest
@pytest.fixture # 创建一个fixture定义一个自己的夹具
def hello_world():
print("hello")
yield
print("\nworld")
@pytest.mark.only
def test_baidu(page: Page, hello_world):
page.goto(url="https://www.baidu.com")
# page.wait_for_timeout(5000)
page.locator('//textarea[@id="chat-textarea"]').fill("playwright")
page.locator('//button[@id="chat-submit-button"]').click()
page.wait_for_timeout(10000)