使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 21--PO(POM) 设计模式代码实现和全局浏览器驱动设置
测试学习记录,仅供参考!
一、 PO(POM)设计模式代码实现
管理页面类和页面元素
1、在项目根目录下新建名称为 pageObject(用来管理页面类) 的软件包,在 pageObject 软件包下新建名称为 login_page(登录页面) 的目录文件,在 login_page 目录下新建名称为 login_page.py 的 Python 文件;
定义一个测试类,因为 class LoginPage 是一个页面类,所以不需要以 test 开头;这个页面类里面去维护一些元素定位和操作,首先得先导入定位元素 By 类 ,这里写一个类变量,使用类属性,不需要 __init__ 初始化为实例属性,一般正常写法是“self.driver.find_element(By.NAME, 'username')”,但是每一个都这么写的话很不方便,此时需要引入前面介绍过的二次封装(找到元素方法)方法,导入 BasePage 类,然后使用页面类去继承 BasePage 类(这样页面类就可以用到已经封装好的公共方法了)
把被测试页面的 url 地址、用户名、密码、登录按钮等都放到页面类里面管理,先完成“元素”,再继续“操作”,例如:第一个 登录操作,定义一个 def login(): 函数,登录里面带两个参数(self, user_name, pass_word):就是要输入的操作,输入的用户名(user_name)和密码(pass_word),使用 self.open_url()(因为页面类已经继承了公共的webdriver 二次封装方法,所以可以使用 BasePage 类里面的任何属性和方法) 打开页面,里面把 url 传过来,还是通过 self.url 调用这个 LoginPage 类 url 变量(self.url 中的 self 是表示类本身的意思),下一步跟着输入操作(输入操作亦已经封装了,同样的通过 self. 点调用,注意二次封装方法的参数若有默认值的可以不填)
为什么要对 webdriver 里面的方法进行二次封装,为了页面类使用的时候更方便,不用每一个都去写一个“去查找、去定位 driver.find_element(By.NAME, 'username')”,简化了代码量,这就是二次封装的一个好处;
from selenium.webdriver.common.by import By
from util_tools.basePage import BasePageclass LoginPage(BasePage):url = 'http://localhost:8088/ecshop/user.php'# 用户名username = (By.NAME, 'username')# 密码password = (By.NAME, 'password')# 登录按钮submit = (By.NAME, 'submit')# 登录操作def login(self, user_name, pass_word):# 打开网址self.open_url(self.url)# 输入用户名self.send_keys(self.username, user_name)# 输入密码self.send_keys(self.password, pass_word)# 点击登录按钮self.click(self.submit)
至此,登录页面的第一个操作“登录操作”就已经封装完成了;
管理测试类
2、改造 testcase 软件包 login 目录下 test_login.py 文件;
先导包引入 LoginPage 类,登录成功里面的‘打开浏览器’、‘定位信息’、已经在上一步的页面类中维护了(元素),所以不需要了;一些输入的操作也是在页面类(操作)中维护,亦不需要了;这时候需要直接用到页面类,把导进来的 LoginPage 类直接用就行了;
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from pageObject.login_page.login_page import LoginPageclass TestLogin: