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

时间:2018-02-03 15:42:51

标签: python selenium object pom.xml models

尝试使用selenium和python实现页面对象模型练习,但是没有启动chrome的实例。任何人都能指出我正确的方向吗?我希望Chrome能够启动并填写登录表单。

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

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

这就是我的文件设置方式。我在单独的文件夹中有2个python文件。这两个文件夹都在项目文件夹中。

页/ login_page.py

测试/ 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_()

1 个答案:

答案 0 :(得分:0)

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

但是,更重要的是,您无法在班级名称上拨打with_()login_succesfull_()。相反,您需要Login类的实例。

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

import unittest.TestCase

class TestLogin(TestCase):
    pass

大多数此类将使用setUp()方法初始化类中每个测试的fixture。例如,您可以在此处执行登录:

import unittest.TestCase

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

接下来,您的login()函数会使用一个永远不会使用的request参数。你可以删除它:

def login(self):
    ...

现在,在您的测试中,使用我们在page中创建的setUp()成员变量:

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

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