在页面对象模型中集成使用webdriver会话ID

问题描述 投票:0回答:1

我想在我们的 Web 应用程序中运行自动化测试,但遇到了测试用例运行时的麻烦。为了优化这一点,我决定最好不要从登录页面重新运行有效测试用例中的浏览器。

我研究了获取和使用会话 ID,但我不知道如何将其集成到 POM(页面对象模型)

这是我的设置:

conftest.py

@pytest.fixture()`
def driver(request):
    browser = request.config.getoption("--browser")
    proxy_username = ''
    proxy_password = ''
    
    seleniumwire_options = {
    'proxy': {
        'http': f'http://{proxy_username}:{proxy_password}@999.999.999.99:9999',
        'verify_ssl': False,
        },
    }
    if browser == 'edge':
        # browser_driver = webdriver.Edge()
        browser_driver = webdriver.Edge(seleniumwire_options=seleniumwire_options)
    elif browser == 'chrome':
        browser_driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()),
                                          seleniumwire_options=seleniumwire_options)
    elif browser == 'firefox':
        browser_driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
    else:
        raise TypeError(f"{browser} not available")
  
    yield browser_driver

    browser_driver.quit()


def pytest_addoption(parser):
    parser.addoption(
        "--browser",
        action="store",
        default='edge',
        help='browser to execute test(edge, chrome, or firefox)')

base_page.py

class BasePage:
    def __init__(self, driver: WebDriver):
        self._driver = driver
        self._wait = WebDriverWait(self._driver, timeout=10)

*and other functions*

login_page.py

class LoginPage(BasePage):
    __url = sampleurl

    def __init__(self, driver: WebDriver):
        super().__init__(driver)

我使用的是Python 3.10。

python selenium-webdriver
1个回答
0
投票

在此实现中,我添加了一个函数 create_driver_session,该函数使用保存的会话 ID 和执行程序 URL 附加到现有的 WebDriver 会话。该装置首先尝试使用现有会话(如果可用);否则,它会在您的 conftest.py 中创建一个新的

import os
import json
from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver

def create_driver_session(session_id, executor_url):
    original_execute = RemoteWebDriver.execute
    def new_command_execute(self, command, params=None):
        if command == "newSession":
            return {'success': 0, 'value': None, 'sessionId': session_id}
        else:
            return original_execute(self, command, params)
    RemoteWebDriver.execute = new_command_execute
    driver = webdriver.Remote(command_executor=executor_url, desired_capabilities={})
    driver.session_id = session_id
    RemoteWebDriver.execute = original_execute
    return driver

@pytest.fixture()
def driver(request):
    browser = request.config.getoption("--browser")
    session_file = 'browser_session.json'
    if os.path.exists(session_file):
        with open(session_file, 'r') as file:
            session_data = json.load(file)
            driver = create_driver_session(session_data['session_id'], session_data['executor_url'])
            if driver:
                yield driver
                return

    # ... rest of your driver setup code ...

    # Save session ID and executor URL
    session_data = {
        'session_id': browser_driver.session_id,
        'executor_url': browser_driver.command_executor._url
    }
    with open(session_file, 'w') as file:
        json.dump(session_data, file)

    yield browser_driver
    browser_driver.quit()


© www.soinside.com 2019 - 2024. All rights reserved.