1. 什么是PageFactory设计模式
PageFactory是一种设计模式,用于创建和维护页面对象。PageFactory的主要目的是将页面对象的创建和初始化与测试用例代码分离,从而提高测试代码的可维护性和可读性。
2. PageFactory设计模式的优势
2.1 分离页面对象和测试代码
PageFactory将页面对象的创建和初始化工作封装在一个单独的类中,这样测试用例代码只需要关注测试逻辑而不需要关心页面对象的创建和初始化细节。这样一来,测试用例的代码更加简洁,易于理解和维护。
2.2 提高代码复用性
通过使用PageFactory设计模式,我们可以将页面对象的创建和初始化逻辑封装在一个类中,并在需要使用该页面对象的测试用例中进行调用。这样,不仅测试用例可以复用,还可以避免代码的重复编写。
代码示例:
class LoginPage:
def __init__(self, driver):
self.driver = driver
def login(self, username, password):
# login logic here
class HomePage:
def __init__(self, driver):
self.driver = driver
def navigate_to_page(self, page_name):
# navigate logic here
3. PageFactory设计模式的使用
3.1 创建页面对象类
在PageFactory设计模式中,每个页面都对应一个页面对象类。页面对象类封装了页面的元素和操作方法。
3.2 使用@FindBy注解定位元素
@FindBy注解是PageFactory设计模式的核心。通过使用@FindBy注解,我们可以将页面对象的元素与页面的实际元素进行绑定。@FindBy注解可以通过xpath、css selector、id等方式定位元素。
代码示例:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class LoginPage:
@FindBy(xpath="//input[@name='username']")
username_input = ""
@FindBy(xpath="//input[@name='password']")
password_input = ""
@FindBy(xpath="//button[@id='login-btn']")
login_button = ""
def __init__(self, driver):
self.driver = driver
def login(self, username, password):
# 使用WebDriverWait等待元素可见
WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, self.username_input)))
# 输入用户名
self.driver.find_element(By.XPATH, self.username_input).send_keys(username)
# 输入密码
self.driver.find_element(By.XPATH, self.password_input).send_keys(password)
# 点击登录按钮
self.driver.find_element(By.XPATH, self.login_button).click()
3.3 初始化页面对象
在测试用例中,我们需要先初始化页面对象,然后调用页面对象的方法来操作页面。
代码示例:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from page_objects import PageFactory
class TestLogin:
def setup_method(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.example.com/login")
self.login_page = PageFactory.init_page(self.driver, LoginPage)
def test_login(self):
self.login_page.login("username", "password")
# 等待页面加载完成
WebDriverWait(self.driver, 10).until(EC.title_is("Home"))
assert self.driver.title == "Home"
4. PageFactory设计模式的示例
4.1 实现一个注册页面对象
下面是一个注册页面对象的示例代码。
代码示例:
class RegisterPage:
@FindBy(xpath="//input[@name='username']")
username_input = ""
@FindBy(xpath="//input[@name='password']")
password_input = ""
@FindBy(xpath="//input[@name='confirm_password']")
confirm_password_input = ""
@FindBy(xpath="//button[@id='register-btn']")
register_button = ""
def __init__(self, driver):
self.driver = driver
def register(self, username, password):
self.driver.find_element(By.XPATH, self.username_input).send_keys(username)
self.driver.find_element(By.XPATH, self.password_input).send_keys(password)
self.driver.find_element(By.XPATH, self.confirm_password_input).send_keys(password)
self.driver.find_element(By.XPATH, self.register_button).click()
4.2 使用注册页面对象
在测试用例中,我们可以先初始化注册页面对象,然后调用注册方法进行注册操作。
代码示例:
class TestRegister:
def setup_method(self):
self.driver = webdriver.Chrome()
self.driver.get("https://www.example.com/register")
self.register_page = PageFactory.init_page(self.driver, RegisterPage)
def test_register(self):
self.register_page.register("username", "password")
# 等待注册成功提示出现
WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='success-message']")))
总结
PageFactory设计模式是一种优化测试代码结构和提高代码可维护性的方法。通过将页面对象的创建和初始化逻辑封装在一个类中,并通过@FindBy注解将页面的元素与页面对象进行绑定,可以实现页面对象的复用和简化测试用例代码。在实际使用中,我们可以根据项目的需求来创建不同的页面对象,并在测试用例中使用这些页面对象进行操作。这样可以使测试代码更具有可读性和可维护性。