我想在我们的 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。
在此实现中,我添加了一个函数 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()