【问题标题】:Selenium Pytest missing argument in methodSelenium Pytest 方法中缺少参数
【发布时间】:2020-09-23 20:33:42
【问题描述】:

我正在尝试使用 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 中的东西只是我为了更容易找到元素而创建的一些函数,基本上只是返回各种形式的 driver.find_element(By.by, 'text')。他们还没有给我问题

【问题讨论】:

    标签: python-3.x selenium selenium-webdriver pytest pageobjects


    【解决方案1】:

    你几乎明白了,只需在驱动程序前添加self

    LoginPage.admin_login(self, driver)
    

    【讨论】:

    • 我试过了,但仍然出现同样的错误,它说缺少 2 而不是 1
    • 没关系让它工作。我还必须将我的 LoginPage 方法中的所有 self 更改为 LoginPage `def admin_login(self, driver): LoginPage.login(driver, '#####', '######') assert 'Admin Menu '在driver.page_source'
    【解决方案2】:

    感谢 Jortega 为我指明了正确的方向。 解决方案最终是将 test_startup.py 中的行更改为读取

    LoginPage.adming_login(LoginPage, driver)
    

    只需添加 self 需要我返回并在 login_page.py 文件中将所有 self.[] 更改为 LoginPage.[]

    在调用时将其添加到方法中更容易。话虽如此,我个人讨厌这看起来的方式。看到 LoginPage 在同一行中键入了两次。有没有更好更讨人喜欢的写法?

    编辑:所以我在过去的一年中学到了很多东西,只是想添加一个更好的解决方案。本质上我很愚蠢,应该声明页面对象的实例,而不是仅仅调用类。

    login_page = LoginPage(driver)
    login_page.admin_login()
    

    为了更好地声明 pytest 夹具中的所有页面对象

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2014-04-15
      • 2015-02-06
      • 2016-07-26
      • 1970-01-01
      • 2019-12-21
      相关资源
      最近更新 更多