由于 __init__ 构造函数,Pytest collection 警告

Pytest collection warning due to __init__ constructor

我一直在自学使用 Pytest 和 Selenium web 进行测试自动化 driver。我所有的测试函数都在一个名为 test_web.py 的文件中,该文件位于名为 tests 的目录中。我将所有函数拆分,并将它们放在一个名为 TestCases 的单独目录中的文件中。例如,这是 TestCase_AddStar.py 的样子:

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class Tags:
    starSysButton = '//li[button][1]'
    addStarButton = "//button[contains(text(), 'Add Star')]"
    starNameField = "//input[1]"
    modalAddButton = f"(//button[contains(text(), 'Add')])[2]"
    starPath = f"//td[contains(text(),'Bob')]"
    modalClose = "//button[@class='btn-close']"

class TestCase_AddStar():

    URL = 'http://localhost:4200'

    def __init__(self, browser):
        self.browser = browser

    def load(self):
        self.browser(self.URL)

    def test_addStar(self, browser):

        starElement = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.starSysButton)))
        starElement.click()

        newStarElement = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.addStarButton)))
        newStarElement.click()

        enterStarName = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.starNameField)))
        enterStarName.send_keys("Bob")

        clickAddButton = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.modalAddButton)))
        clickAddButton.click()

        WebDriverWait(browser, 5).until(EC.alert_is_present())
        alert = Alert(browser)
        alert.accept()

        closeModal = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.modalClose)))
        closeModal.click()

        results = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.XPATH, Tags.starPath)))
            
        if results:
            assert results

而这就是driver、test_web.py。现在看起来像:

import pytest
from TestCases.TestCase_AddStar import TestCase_AddStar
from selenium.webdriver import Firefox

@pytest.fixture
def browser():
    driver = Firefox()
    driver.implicitly_wait(10)
    yield driver
    driver.quit()

def basic_test(browser):

    add_star = TestCase_AddStar(browser)
    add_star.load()

当我 运行 测试时,我收到 collection 警告:

PytestCollectionWarning: cannot collect test class 'TestCase_AddStar' because it has a init constructor (from: tests/test_web.py) class TestCase_AddStar():

我尝试将行“test = False”添加到 class TestCase_AddStar,我尝试重命名文件以便它它的文件名中没有“test”一词,我试图完全取消 init 构造函数。没有任何效果。我要么收到 collection 警告,要么直接跳过测试,要么因为浏览器未加载而导致测试超时。

有人有什么建议吗?

编辑 1

TestCase_AddStar.py

class TestCase_AddStar():

    URL = 'http://localhost:4200'

    @pytest.fixture
    def load_browser(self, browser):
        browser(self.URL)
        yield
    
    def test_addStar(self, load_browser):

        starElement = WebDriverWait(load_browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.starSysButton)))
        starElement.click()

        newStarElement = WebDriverWait(load_browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.addStarButton)))
        newStarElement.click()

        enterStarName = WebDriverWait(load_browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.starNameField)))
        enterStarName.send_keys("Bob")

        clickAddButton = WebDriverWait(load_browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.modalAddButton)))
        clickAddButton.click()

        WebDriverWait(load_browser, 5).until(EC.alert_is_present())
        alert = Alert(load_browser)
        alert.accept()

        closeModal = WebDriverWait(load_browser, 10).until(EC.element_to_be_clickable((By.XPATH, Tags.modalClose)))
        closeModal.click()

        results = WebDriverWait(load_browser, 10).until(EC.presence_of_element_located((By.XPATH, Tags.starPath)))
            
        if results:
            assert results

test_web.py

import pytest
from TestCases.TestCase_AddStar import TestCase_AddStar
from selenium.webdriver import Firefox

@pytest.fixture
def browser():
    driver = Firefox()
    driver.implicitly_wait(10)
    yield driver
    driver.quit()

TestCase_AddStar()

我在回溯中得到以下错误:

@pytest.fixture
def load_browser(self, browser):
browser(self.URL)
E       TypeError: 'WebDriver' object is not callable

编辑 2

按照下面的建议添加了 .get()。但是我现在有一个新的错误。

如您所见,测试不能在 __init__ 中包含参数,因为它是由 pytest 自动创建的。据我了解,您只想在特定测试 class 中加载特定 URL - 这也可以在固定装置中完成。只需从 browser 夹具派生夹具并添加加载函数:

class TestCase_AddStar:

    URL = 'http://localhost:4200'

    @pytest.fixture
    def load_browser(self, browser):
        browser.get(self.URL)
        yield browser

    def test_addStar(self, load_browser):
        ...

请注意,您不需要 __init__ 方法和 basic_test 函数(无论如何都不适用于 pytest)。您可以使用另一个 URL 参数将类似的派生夹具添加到每个测试 class 中。

您的派生夹具将等同于:

@pytest.fixture
def load_browser(self):
    driver = Firefox()
    driver.implicitly_wait(10)
    driver.get(self.url)
    yield driver
    driver.quit()

(这只是为了说明派生夹具的工作原理)