Selenium 自动化 selenium +po+pytest 疑点

多多 · 2024年07月11日 · 最后由 julymi_77 回复于 2024年08月23日 · 2990 次阅读

完整的代码在 github 上,ssh:git@github.com:GrowthDuo/pom_mumu.git
我想将 driver 设置为会话级别,想要优化一下,首页代码可以直接调用登录的方法。

这是我的driver的代码
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.firefox.service import Service as FirefoxService
from selenium.webdriver.chrome.options import Options as ChromeOptions
from selenium.webdriver.firefox.options import Options as FirefoxOptions

@pytest.fixture(scope="session")
def driver(request):
    browser_type = request.config.getoption("--browser")
    headless = request.config.getoption("--headless")

    if browser_type == 'chrome':
        chrome_options = ChromeOptions()
        if headless:
            chrome_options.add_argument('--headless')
        chrome_service = ChromeService(executable_path='/path/to/chromedriver')
        driver = webdriver.Chrome(service=chrome_service, options=chrome_options)
    elif browser_type == 'firefox':
        firefox_options = FirefoxOptions()
        if headless:
            firefox_options.add_argument('--headless')
        firefox_service = FirefoxService(executable_path='/path/to/geckodriver')
        driver = webdriver.Firefox(service=firefox_service, options=firefox_options)
    else:
        raise ValueError("Unsupported browser type")

    driver.maximize_window()
    yield driver
    driver.quit()

接下来的是登录测试代码

import time
import allure
from page_object.UserLoginPage import UserLoginPage
from config.config_driver import initialize_driver
from common.yaml_config import UserConfig  # 假设你将上面的类保存在config/user_config.py中
from util import util
# 使用pytest类启动
# @pytest.mark.parametrize('username, password', [('will', '<PASSWORD>'), ('tom', '123456')])
class TestLoginPage():
    @classmethod
    def setup_class(cls):
        """
        测试用例执行前执行
        :return:
        """
        # 初始化浏览器驱动
        cls.driver = initialize_driver('chrome')
        # 实例化页面对象
        cls.login_page = UserLoginPage(cls.driver)
    def test_login(self):
        # driver = initialize_driver('chrome')  # 假设使用Chrome浏览器
        # # 实例化页面对象
        # login_page = UserLoginPage(driver)

        # 加载用户配置
        config = UserConfig()  # 单一实例
        login_url = config.get_url()
        self.driver.get(login_url)
        # 获取日志对象
        logger = util.get_logger()
        logger.info('测试用户登录')

        # 获取用户名和密码
        username, password = config.get_credentials('will')

        # 输入用户名和密码
        with allure.step("第一步: 输入用户名"):

            self.login_page.input_username(username)
            logger.debug('输入用户名称: %s', username)

        with allure.step("第二步: 输入密码"):
            self.login_page.input_pwd(password)
            logger.debug('输入密码: %s', password)

            # 在打开网页前截屏
            before_screenshot = self.driver.get_screenshot_as_png()
            allure.attach(before_screenshot, name='登录网页', attachment_type=allure.attachment_type.PNG)

        with allure.step("第三步: 点击登录"):
            self.login_page.login_click()
            logger.debug('点击登录')
            print(self.driver.title)
            time.sleep(3)
            # # 等待页面加载完成,这里以等待某个特定元素出现为例
            # login_page.wait_for_title()
            # 登录后截屏
            after_screenshot = self.driver.get_screenshot_as_png()
            allure.attach(after_screenshot, name='登录成功后进入首页', attachment_type=allure.attachment_type.PNG)

        # 这里可以添加断言来验证登录是否成功
        with allure.step("登录"):
            try:
                assert 'AutoMeter' == self.driver.title
            except AssertionError:
                allure.attach(after_screenshot, name='登录失败', attachment_type=allure.attachment_type.PNG)
                logger.error("注意,注意,  %s", "报错了", exc_info=1)
    @classmethod
    def teardown_class(cls):
        cls.driver.quit()

下面的是首页,首页要先登录,我想直接调用登录的登录方法

import time

import pytest
import allure
from page_object.UserLoginPage import UserLoginPage
from page_object.ProjectManagementPage import ProjectManagementPage
from config.config_driver import initialize_driver
from common.yaml_config import UserConfig
from util import util

class TestHomePage:
    @classmethod
    def setup_class(cls):
        cls.driver = initialize_driver('chrome')
        cls.login_page = UserLoginPage(cls.driver)
        cls.project_page = ProjectManagementPage(cls.driver)

    def test_home_page(self):
        config = UserConfig()
        login_url = config.get_url()
        self.driver.get(login_url)
        self.logger = util.get_logger()
        self.logger.info('测试首页')

        username, password = config.get_credentials('will')

        with allure.step("第一步: 输入用户名"):
            self.login_page.input_username(username)
            self.logger.debug('输入用户名称: %s', username)

        with allure.step("第二步: 输入密码"):
            self.login_page.input_pwd(password)
            self.logger.debug('输入密码: %s', password)

        with allure.step("第三步: 点击登录"):
            self.login_page.login_click()
            self.logger.debug('点击登录')
            #
            self.login_page.wait_for_title()

        with allure.step("第四步: 点击项目管理"):
            self.project_page.click_pro()
            self.logger.debug('点击项目管理')
            time.sleep(3)
        # 点击项目管理
        with allure.step("第四步: 点击项目管理"):
            self.project_page.click_pro()
            self.logger.debug('点击项目管理')
            time.sleep(3)

        with allure.step("第五步: 输入项目名称"):
            time.sleep(3)
            project_name = "测试项目"
            self.project_page.input_project_name(project_name)
            self.logger.debug('输入项目名称: %s', project_name)

        with allure.step("第六步: 点击查询"):
            self.project_page.click_project()
            self.logger.debug('点击查询')

    @classmethod
    def teardown_class(cls):
        cls.driver.quit()
if __name__ == '__main__':
    pytest.main(['-v' ,'-s', 'test_home_page.py'])
共收到 3 条回复 时间 点赞

git@github.com:GrowthDuo/pom_mumu.git

多多 关闭了讨论 07月14日 23:21
多多 重新开启了讨论 07月14日 23:21

你这个 conftest 中的 driver 使用了??怎么看你的代码 cls.driver 是实例化出来的。

conftest 里面写了 fixture 后,在测试用例的地方进行使用:
@pytest.mark.usefixtures('driver')

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册