Python+Pytest+SeleniumBase实现每个测试文件前置登录需求求助
解决方案:类级别登录实现(适配Pytest+SeleniumBase)
核心思路是利用类级别的初始化逻辑,让每个测试文件对应的测试类在执行所有用例前完成一次登录,不同文件的测试类独立触发登录流程。以下是两种可行的实现方式:
方式1:重写SeleniumBase的setup_class类方法
SeleniumBase的BaseCase内置了类级别的初始化方法setup_class,重写该方法即可在当前测试类的所有用例执行前完成登录。每个测试文件对应一个独立的测试类,自然会触发各自的登录流程。
封装登录工具函数(避免代码重复)
先把登录逻辑抽成通用函数,放在utils.py中:
def perform_login(test_class): # 打开登录页 test_class.open("https://你的登录页面URL") # 输入账号密码 test_class.type("#用户名输入框选择器", "你的账号") test_class.type("#密码输入框选择器", "你的密码") # 点击登录按钮 test_class.click("#登录按钮选择器") # 验证登录成功(比如检查登录后的标识元素) test_class.assert_element("#登录后显示的用户标识选择器")
测试文件示例
TEST_F1.py
from seleniumbase import BaseCase from utils import perform_login class TestF1(BaseCase): @classmethod def setup_class(cls): # 类初始化时执行登录 perform_login(cls) def test_f1_case1(self): # 测试用例1逻辑 self.open("https://测试页面1") self.assert_title("预期页面标题") def test_f1_case2(self): # 测试用例2逻辑 self.open("https://测试页面2") self.assert_element("#目标元素选择器")
TEST_F2.py
from seleniumbase import BaseCase from utils import perform_login class TestF2(BaseCase): @classmethod def setup_class(cls): # 再次执行登录流程 perform_login(cls) def test_f2_case1(self): self.open("https://测试页面3") self.assert_text("预期文本", "#文本容器选择器") def test_f2_case2(self): self.open("https://测试页面4") self.assert_element_visible("#可见元素选择器")
方式2:使用Pytest类级别Fixture
通过Pytest的scope="class" fixture,实现跨测试类的登录逻辑复用,同样能保证每个测试类执行前触发一次登录。
在conftest.py中定义Fixture
import pytest @pytest.fixture(scope="class") def class_login(request): test_class = request.cls # 执行登录流程 test_class.open("https://你的登录页面URL") test_class.type("#用户名输入框选择器", "你的账号") test_class.type("#密码输入框选择器", "你的密码") test_class.click("#登录按钮选择器") test_class.assert_element("#登录后用户标识选择器") yield # 可选:测试类执行完成后关闭浏览器 test_class.quit()
测试文件中使用Fixture
TEST_F1.py
from seleniumbase import BaseCase import pytest @pytest.mark.usefixtures("class_login") class TestF1(BaseCase): def test_f1_case1(self): self.open("https://测试页面1") self.assert_title("预期标题") def test_f1_case2(self): self.open("https://测试页面2") self.assert_element("#目标元素")
TEST_F2.py
from seleniumbase import BaseCase import pytest @pytest.mark.usefixtures("class_login") class TestF2(BaseCase): def test_f2_case1(self): self.open("https://测试页面3") self.assert_text("欢迎", "#欢迎文本容器") def test_f2_case2(self): self.open("https://测试页面4") self.assert_element_visible("#仪表盘元素")
运行验证
执行pytest TEST_F1.py TEST_F2.py时,会先执行TestF1的setup_class/fixture完成登录,跑完所有F1的用例后,再执行TestF2的登录逻辑,然后跑完F2的所有用例,完全符合需求。
内容的提问来源于stack exchange,提问作者Sanjay Prakash
相关产品推荐
相关产品推荐

