【发布时间】: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