Selenium Pytest 在方法中缺少参数
Selenium Pytest missing argument in method
我正在尝试使用 seleium 和 pytest 进行 web 测试的页面对象设计。我一直在 test_startup.py 中收到此 TypeError admin_login() missing 1 required positional argument: 'driver'
我真的不明白哪里出了问题。这是代码和文件
test_startup.py
from page_objects.login_page import LoginPage
import pytest
from selenium import webdriver
@pytest.fixture(scope='class')
def chrome_driver_init(request):
chrome_driver = webdriver.Chrome('chrome_driver_path')
chrome_driver.get('https://url')
chrome_driver.find_element_by_id('details-button').click()
chrome_driver.find_element_by_id('proceed-link').click()
request.cls.driver = chrome_driver
yield
chrome_driver.close()
@pytest.mark.usefixtures('chrome_driver_init')
class TestStartUp:
def test_login(self):
driver = self.driver
LoginPage.admin_login(driver)
login_page.py
import extensions.tools as tools
from selenium.webdriver.common.by import By
import pytest
class LoginPage(object):
def __init__(self, driver):
self.driver = driver
def login(self, driver, username, password):
tools.find_element_and_send_keys(driver, self.Locators.username, username)
tools.find_element_and_send_keys(driver, self.Locators.password, password)
tools.find_element_and_click(driver, self.Locators.submitButton)
def admin_login(self, driver):
self.login(driver, '#####', '######')
assert 'Admin Menu' in driver.page_source
class Locators:
submitButton = (By.NAME, 'login')
username = (By.NAME, 'j_username')
password = (By.NAME, 'j.password')
来自 tools.py 的东西只是我为了更容易找到元素而制作的一些函数,基本上只是 return 各种形式的 driver.find_element(By.by, 'text').他们还没有给我问题
你差不多明白了,只需在驱动程序前添加 self
。
LoginPage.admin_login(self, driver)
感谢 Jortega 为我指明了正确的方向。
解决方案最终是将 test_startup.py 中的行更改为读取
LoginPage.adming_login(LoginPage, driver)
简单地添加 self 需要我返回并将 login_page.py 文件中的所有 self.[] 更改为 LoginPage.[]
调用时将其添加到方法中更容易。话虽如此,我个人讨厌它的样子。看到在同一行中输入了两次 LoginPage。有没有更好更赏心悦目的写法?
编辑:所以我在过去的一年里学到了很多东西,只是想添加一个更好的解决方案。本质上我是愚蠢的,应该声明页面对象的实例而不是仅仅调用 class.
login_page = LoginPage(driver)
login_page.admin_login()
为了更好地声明 pytest fixture 中的所有页面对象
from page_objects.login_page import LoginPage
import pytest
from selenium import webdriver
@pytest.fixture(scope='class')
def chrome_driver_init(request):
chrome_driver = webdriver.Chrome('chrome_driver_path')
chrome_driver.get('https://url')
chrome_driver.find_element_by_id('details-button').click()
chrome_driver.find_element_by_id('proceed-link').click()
request.cls.driver = chrome_driver
request.cls.login_page(chrome_driver)
yield
chrome_driver.close()
@pytest.mark.usefixtures('chrome_driver_init')
class TestStartUp:
def test_login(self):
self.login_page.admin_login()
我正在尝试使用 seleium 和 pytest 进行 web 测试的页面对象设计。我一直在 test_startup.py 中收到此 TypeError admin_login() missing 1 required positional argument: 'driver'
我真的不明白哪里出了问题。这是代码和文件
test_startup.py
from page_objects.login_page import LoginPage
import pytest
from selenium import webdriver
@pytest.fixture(scope='class')
def chrome_driver_init(request):
chrome_driver = webdriver.Chrome('chrome_driver_path')
chrome_driver.get('https://url')
chrome_driver.find_element_by_id('details-button').click()
chrome_driver.find_element_by_id('proceed-link').click()
request.cls.driver = chrome_driver
yield
chrome_driver.close()
@pytest.mark.usefixtures('chrome_driver_init')
class TestStartUp:
def test_login(self):
driver = self.driver
LoginPage.admin_login(driver)
login_page.py
import extensions.tools as tools
from selenium.webdriver.common.by import By
import pytest
class LoginPage(object):
def __init__(self, driver):
self.driver = driver
def login(self, driver, username, password):
tools.find_element_and_send_keys(driver, self.Locators.username, username)
tools.find_element_and_send_keys(driver, self.Locators.password, password)
tools.find_element_and_click(driver, self.Locators.submitButton)
def admin_login(self, driver):
self.login(driver, '#####', '######')
assert 'Admin Menu' in driver.page_source
class Locators:
submitButton = (By.NAME, 'login')
username = (By.NAME, 'j_username')
password = (By.NAME, 'j.password')
来自 tools.py 的东西只是我为了更容易找到元素而制作的一些函数,基本上只是 return 各种形式的 driver.find_element(By.by, 'text').他们还没有给我问题
你差不多明白了,只需在驱动程序前添加 self
。
LoginPage.admin_login(self, driver)
感谢 Jortega 为我指明了正确的方向。 解决方案最终是将 test_startup.py 中的行更改为读取
LoginPage.adming_login(LoginPage, driver)
简单地添加 self 需要我返回并将 login_page.py 文件中的所有 self.[] 更改为 LoginPage.[]
调用时将其添加到方法中更容易。话虽如此,我个人讨厌它的样子。看到在同一行中输入了两次 LoginPage。有没有更好更赏心悦目的写法?
编辑:所以我在过去的一年里学到了很多东西,只是想添加一个更好的解决方案。本质上我是愚蠢的,应该声明页面对象的实例而不是仅仅调用 class.
login_page = LoginPage(driver)
login_page.admin_login()
为了更好地声明 pytest fixture 中的所有页面对象
from page_objects.login_page import LoginPage
import pytest
from selenium import webdriver
@pytest.fixture(scope='class')
def chrome_driver_init(request):
chrome_driver = webdriver.Chrome('chrome_driver_path')
chrome_driver.get('https://url')
chrome_driver.find_element_by_id('details-button').click()
chrome_driver.find_element_by_id('proceed-link').click()
request.cls.driver = chrome_driver
request.cls.login_page(chrome_driver)
yield
chrome_driver.close()
@pytest.mark.usefixtures('chrome_driver_init')
class TestStartUp:
def test_login(self):
self.login_page.admin_login()