[英]Python + Selenium: Page object pattern: Need help to figure out why it doesn't see an attribute
我是 Python + Selenium 新手。 今天开始学习页面对象模式,遇到了这个错误:
Traceback (most recent call last):
File "logintest.py", line 17, in test_login
login_page.login()
File "D:\Tests\page object pattern\loginpage.py", line 19, in login
BasePage.fill_the_form(loginform, email)
NameError: name 'loginform' is not defined
我不知道为什么它扔了,因为登录表单定义。
from abc import abstractmethod
from selenium import webdriver
class BasePage(object):
def __init__(self, driver):
self.driver = driver
@abstractmethod
def _validate_page(self, driver):
return
def fill_the_form(self, locator, value):
form = self.driver.find_element(locator)
self.form.clear()
self.form.send_keys(value)
def go_to(self, locator):
self.driver.find_element(locator)
self.driver.click()
from base import BasePage
from homepage import HomePage
from selenium.webdriver.common.by import By
class LoginPage(BasePage):
email = 'test@test.net'
password = 'test'
loginform = (By.ID, 'email')
passwordform = (By.ID, 'password')
button = (By.XPATH, "//*[contains(text(), 'Log In')]")
def __init__(self, driver):
super(LoginPage, self).__init__(driver)
def _validate_page(self, driver):
assert 'Login' in driver.title()
def login(self):
BasePage.fill_the_form(loginform, email)
BasePage.fill_the_form(passwordform, password)
BasePage.go_to(button)
from selenium import webdriver
import unittest
class BaseTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(10)
self.driver.get('https://testtest.com/')
def tearDown(self):
self.driver.quit()
最后我的测试:
import unittest
from basetest import BaseTest
from base import BasePage
from loginpage import LoginPage
class logintest(BaseTest):
def test_login(self):
login_page = LoginPage(self.driver)
login_page.login()
if __name__ == '__main__':
unittest.main(verbosity = 2)
变量email
、 password
、 loginform
等是静态的。 要访问它们,请使用LoginPage.loginform
:
def login(self):
BasePage.fill_the_form(LoginPage.loginform, LoginPage.email)
BasePage.fill_the_form(LoginPage.passwordform, LoginPage.password)
BasePage.go_to(LoginPage.button)
或者在__init__
声明它们:
def __init__(self, driver):
super(LoginPage, self).__init__(driver)
self.email = 'test@test.net'
self.password = 'test'
self.loginform = (By.ID, 'email')
self.passwordform = (By.ID, 'password')
self.button = (By.XPATH, "//*[contains(text(), 'Log In')]")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.