【问题标题】:Pytest collection warning due to __init__ constructor由于 __init__ 构造函数导致的 Pytest 收集警告
【发布时间】:2021-11-30 11:55:49
【问题描述】:

我一直在自学使用 Pytest 和 Selenium Web 驱动程序进行测试自动化。我所有的测试函数都在一个名为 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

这就是驱动程序,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()

当我运行测试时,我收到一个收集警告:

PytestCollectionWarning:无法收集测试类“TestCase_AddStar”,因为它有一个 init 构造函数(来自:tests/test_web.py) 类TestCase_AddStar():

我尝试将“test = False”行添加到类 TestCase_AddStar,我尝试重命名文件,使其文件名中没有单词“test”,我试图完全取消 init 构造函数。没有任何效果。我要么收到收集警告,要么直接跳过测试,要么测试超时,因为浏览器没有加载。

有人有什么建议吗?

编辑 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()。但是我现在遇到了一个新错误。

【问题讨论】:

    标签: python selenium-webdriver automated-tests pytest


    【解决方案1】:

    正如您所注意到的,测试不能在__init__ 中包含参数,因为它是由pytest 自动创建的。据我了解,您只想在特定的测试类中加载特定的 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 参数将类似的派生夹具添加到每个测试类中。

    您的派生装置将等同于:

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

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

    【讨论】:

    • 你是说我应该把浏览器固定装置从驱动程序中取出,并将它放在我创建的每个测试用例文件中?
    • 不,您将派生的夹具添加到每个测试类中,如图所示。
    • 请参阅编辑 1。我现在收到 TypeError。
    • 啊,抱歉,我刚刚从您的代码中复制了它 - 我猜您需要在这里提供 get(),并在答案中进行了更正。
    • 我做了您推荐的更改。测试现在打开浏览器并导航到登录页面,但我现在收到一个属性错误。请参阅上面的编辑 2。我认为这不是 XPATH 问题,因为它在驱动程序中运行良好。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2019-11-24
    • 2012-09-07
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多