Selenium 页面对象模型 python,继承自特定 class

Selenium page object model python, inherit from particular class

尝试使用 selenium 和 python 实现页面对象模型实践,但 chrome 的实例未启动。谁能指出我正确的方向?我期待 Chrome 启动并填写登录表单。

这是控制台当前吐出的内容:进程已完成,退出代码为 0。Login_test 方法出现“未解析的引用 'Login'”错误。

登录下也出现一条红线。在 test_login 方法中尝试使用它时。

我的文件是这样设置的。我在不同的文件夹中有 2 python 个文件。这两个文件夹都在项目文件夹中。

Pages/login_page.py

Tests/login_test.py

#login_page.py file
> from selenium.webdriver.common.by import By

class Login:
    _username_input = {"by": By.NAME, "value": "username"}
    _password_input = {"by": By.NAME, "value": "password"}
    _submit_button = {"by": By.ID, "value": "btn-inloggen"}
    _success_message = {"by": By.CSS_SELECTOR, "value": ".#header > div.right > a:nth-child(4)"}

    def __init__(self, driver):
        self.driver = driver
        self.driver.get("website")

    def with_(self, username, password):
        self.driver.find_element(self._username_input["by"],
                                 self._username_input["value"]).send_keys(username)
        self.driver.find_element(self._password_input["by"],
                                 self._password_input["value"]).send_keys(password)
        self.driver.find_element(self._submit_button["by"],
                                 self._submit_button["value"]).click()

    def login_succesfull_(self):
        return self.driver.find_element(self._success_message["by"],
                                        self._success_message["value"]).is_displayed()<

#test_login.py file
from selenium import webdriver
from Pages import login_page

class TestLogin:

    def login(self, request):
        driver = webdriver.Chrome()

        def quit():
            driver.quit()
        request.addfinalizer(quit)
        return login_page.Login(driver)

    def test_login(self):
        Login.with_("username", "password")
        assert Login.login_succesfull_()

错误是因为在您使用它的可用范围内没有定义名称 Login。相反,您必须像在 login() 函数中那样使用限定名称 login_page.Login

然而,更重要的是,您不能在 class 名称上调用 with_()login_succesfull_()。相反,您需要 Login class.

的实例

缺少几个部分需要修复此问题。首先,Selenium 通常在测试框架的上下文中使用。这不是严格要求的,但却是最常见的用例。 PyCharm 默认使用 unittest 进行 运行 测试。要使用 unittest,您必须创建一个 class 继承自 TestCase class:

import unittest.TestCase

class TestLogin(TestCase):
    pass

大多数这样的 classes 将有一个 setUp() 方法来为 class 中的每个测试初始化​​夹具。例如,您可以在此处执行登录:

import unittest.TestCase

class TestLogin(TestCase):
    def setUp(self):
        self.page = self.login()

接下来,您的 login() 函数接受一个从未使用过的 request 参数。您可以将其删除:

def login(self):
    ...

现在在您的测试中,使用我们在 setUp():

中创建的 page 成员变量
def test_login(self):
    self.page.with_("username", "password")
    assert self.page.login_succesfull_()

我建议您在继续使用 Selenium 之前阅读更多关于 unittest 的内容。您还需要在 Python 中了解有关面向对象编程的更多信息,尤其是创建和使用对象所需的语法。