由于 __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()
(这只是为了说明派生夹具的工作原理)
我一直在自学使用 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()
(这只是为了说明派生夹具的工作原理)