我ui自动化使用python+selenium+pytest,过程中为在测试用例包testcase中的文件conftest中写入前置条件为何在测试用例中并不能找到该前置方法,返回的driver也没有
时间: 2024-04-18 13:24:25 浏览: 13
您好!根据您的描述,可能有几个原因导致测试用例无法找到conftest中的前置方法并且没有返回driver。
首先,请确保您的conftest.py文件位于正确的位置,即与你的测试用例包testcase在同一目录下或者更上层目录,这样pytest才能正确加载并执行conftest中的前置方法。
其次,要确保前置方法使用了正确的装饰器,例如`@pytest.fixture`装饰器来标记它作为一个夹具函数。这样pytest才会自动识别并执行该前置方法。
另外,您还需要在测试用例函数中使用`request`夹具来获取前置方法返回的值。例如,如果前置方法返回了driver对象,您可以在测试用例中使用`request.fixturename`来获取该对象,其中`fixturename`是前置方法的名称。
最后,请检查一下您的测试用例函数是否正确命名,且在测试用例函数的参数列表中是否包含了`request`夹具。这样pytest才会自动传入前置方法返回的值。
如果您仍然无法解决问题,请提供更多的代码和错误信息,以便我更好地帮助您解决问题。
相关问题
Python+selenium+pytest以及po模式的自动化测试框架
Python+Selenium+pytest+PO模式是一种常用的Web UI自动化测试框架,下面是一些基本的步骤:
1. 安装pytest和Selenium:使用pip install pytest selenium命令进行安装。
2. 创建pytest测试用例:创建一个py文件,使用pytest框架编写测试用例,可以使用Selenium进行web页面的操作和数据的验证。
3. 创建PO模式的页面对象:使用Page Object模式构建页面对象,将页面的元素和操作封装在一个类中,方便管理和维护。
4. 运行pytest测试:使用pytest运行测试用例,并查看测试报告。
5. 使用pytest插件:pytest提供了许多插件,例如pytest-html、pytest-xdist等,可以用来生成HTML测试报告、运行分布式测试等。
下面是一个简单的示例代码:
```python
# conftest.py文件
from selenium import webdriver
import pytest
@pytest.fixture(scope='module')
def driver():
driver = webdriver.Chrome()
yield driver
driver.quit()
# test_login.py文件
from pages.login_page import LoginPage
def test_login(driver):
login_page = LoginPage(driver)
login_page.open()
login_page.input_username('test')
login_page.input_password('test123')
login_page.click_submit()
assert login_page.get_login_result() == '登录成功'
# login_page.py文件
from selenium.webdriver.common.by import By
class LoginPage:
url = 'http://localhost/login'
def __init__(self, driver):
self.driver = driver
def open(self):
self.driver.get(self.url)
def input_username(self, username):
self.driver.find_element(By.ID, 'username').send_keys(username)
def input_password(self, password):
self.driver.find_element(By.ID, 'password').send_keys(password)
def click_submit(self):
self.driver.find_element(By.ID, 'submit').click()
def get_login_result(self):
return self.driver.find_element(By.ID, 'result').text
```
在上面的示例中,我们使用了pytest的fixture机制来管理WebDriver对象的生命周期,使用PO模式的页面对象来封装登录页面的元素和操作。我们可以通过执行pytest test_login.py命令来运行测试,并生成测试报告。
请给出Python+Selenium+Pytest+Allure自动化测试工程框架与相关公共代码
以下是一个使用Python+Selenium+Pytest+Allure的自动化测试工程框架示例,包括一些公共的代码:
## 工程结构
```
- project/
- tests/
- test_login.py
- pages/
- base_page.py
- login_page.py
- utils/
- config.py
- driver.py
- logger.py
- reports/
- requirements.txt
- pytest.ini
```
## requirements.txt
```
selenium==3.141.0
pytest==6.2.4
pytest-allure-adaptor==1.7.0
```
## pytest.ini
```
[pytest]
log_cli = true
log_cli_level = INFO
log_cli_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
log_file = logs/test.log
log_file_level = INFO
log_file_format = %(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)
markers =
smoke: Run the smoke test cases
regression: Run the regression test cases
```
## utils/config.py
```python
import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
DRIVER_PATH = os.path.join(PROJECT_ROOT, 'drivers/chromedriver')
BASE_URL = 'http://example.com'
USERNAME = 'testuser'
PASSWORD = 'testpass'
```
## utils/driver.py
```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from utils.config import DRIVER_PATH
def get_driver():
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(executable_path=DRIVER_PATH, options=options)
return driver
```
## utils/logger.py
```python
import logging
import os
from utils.config import PROJECT_ROOT
def get_logger(name):
logger = logging.getLogger(name)
logger.setLevel(logging.INFO)
log_dir = os.path.join(PROJECT_ROOT, 'logs')
if not os.path.exists(log_dir):
os.makedirs(log_dir)
log_file = os.path.join(log_dir, 'test.log')
formatter = logging.Formatter('%(asctime)s [%(levelname)s] %(message)s (%(filename)s:%(lineno)s)')
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger
```
## pages/base_page.py
```python
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from utils.driver import get_driver
from utils.config import BASE_URL
class BasePage:
def __init__(self):
self.driver = get_driver()
self.wait = WebDriverWait(self.driver, 10)
self.base_url = BASE_URL
def open(self, url=None):
if url is None:
url = self.base_url
self.driver.get(url)
def find_element(self, locator):
return self.wait.until(EC.presence_of_element_located(locator))
def find_elements(self, locator):
return self.wait.until(EC.presence_of_all_elements_located(locator))
def click(self, locator):
element = self.find_element(locator)
element.click()
def input(self, locator, text):
element = self.find_element(locator)
element.clear()
element.send_keys(text)
def close(self):
self.driver.quit()
```
## pages/login_page.py
```python
from selenium.webdriver.common.by import By
from pages.base_page import BasePage
from utils.config import USERNAME, PASSWORD
class LoginPage(BasePage):
username_locator = (By.NAME, 'username')
password_locator = (By.NAME, 'password')
submit_locator = (By.CSS_SELECTOR, 'button[type="submit"]')
def login(self, username=USERNAME, password=PASSWORD):
self.open()
self.input(self.username_locator, username)
self.input(self.password_locator, password)
self.click(self.submit_locator)
```
## tests/test_login.py
```python
import allure
import pytest
from pages.login_page import LoginPage
from utils.logger import get_logger
logger = get_logger(__name__)
@allure.feature('Login')
class TestLogin:
@allure.title('Test login with correct username and password')
@allure.severity(allure.severity_level.NORMAL)
@pytest.mark.smoke
def test_login_success(self):
logger.info('Test login with correct username and password')
LoginPage().login()
assert 'Dashboard' in LoginPage().driver.title
@allure.title('Test login with incorrect username or password')
@allure.severity(allure.severity_level.NORMAL)
@pytest.mark.regression
def test_login_failure(self):
logger.info('Test login with incorrect username or password')
LoginPage().login(username='invalid', password='invalid')
assert 'Login' in LoginPage().driver.title
```
使用命令 `pytest --alluredir=./reports` 运行测试,使用命令 `allure serve ./reports` 查看测试报告。