我们的目标是:按照这一套资料学习下来,大家可以独立完成自动化测试的任务。
上一篇我们讨论了数据驱动测试中如何读取各种不同的文件中数据,以及如何完成重复的测试实例,今天我们继续学习。
本篇笔记我们讨论一下如何使用PO模式思想来编写测试用例脚本。以便我们的测试代码更容易维护。
1、PO基础知识
1)PO:page object简述
的简称,是selenium 自动化测试项目开发的最佳设计模式之一。它主要是通过对界面交互细节的封装。这样测试用例对应的脚本更关注与业务本身,也提高测试用例的可读性。
1)PO模式的优点:
a,可以减少代码的重复率
b,提高测试用例脚本的可读性
c,提高测试用例脚本的可维护性
2、page object 实例
1)page object 原理
page object 原理是:我们将page 对象封装成一个HTML页面,通过应用程序特定API来操作页面元素。page 对象应该将GUI控件上查询和操作数据的行为封装为方法。这样就是页面的布局发生变化,page对象的接口并不会发生变化
2)page object实例-登录
我们先贴出来之前登录的例子:
# coding=utf-8 #****************登录模块******************* import time from selenium import webdriver def driver_func(): return webdriver.Chrome("C:\\Users\\dewi\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe") class Login(): def __init__(self,username,password): self.username=username self.password=password def login(self): driver = driver_func() # 打开浏览器,并最大化 driver.get("https://www.saucedemo.com/") driver.maximize_window() time.sleep(3) # 输入用户名, driver.find_element_by_name("user-name").send_keys(self.username) # by name 定位 # 输入密码 driver.find_element_by_name("password").send_keys(self.password) # by name 定位 # 点击登录按钮 driver.find_element_by_id("login-button").click() # by ID 定位 return driver
上面的登录的例子是参考模块化,用于后面来调用。
我们PO模式大概步骤:写page类(封装所有页面共有的方法)>编写login 类(继承page类,封装登录操作需要的元素定位和操作)>编写测试用例脚本(如登录,调用login类)
请参考基础类:
#编写页面类,封装所有页面共有的方法 class Page(object): login_url="https://www.saucedemo.com" def __init__(self,selenium_driver,base_page_url=login_url): #初始化方法来定义驱动,URL和超时时间 self.base_page_url=base_page_url self.driver = selenium_driver self.timeout = 30 def _open(self,url): url = self.base_page_url +url self.driver.get(url) assert self.on_page(),"没有打开%s"%url def on_page(self): return self.driver.current_url==(self.base_page_url + self.url) def open(self): self._open(self.url) def find_element(self,*loc): return self.driver.find_element(*loc)
login 页面类:
class LoginPage(Page): url = "/" #定位元素 username_loc=(By.NAME,"user-name") password_loc=(By.NAME,"password") submit_loc =(By.ID,"login-button") #操作方法封装 def enter_username(self,username): self.find_element(*self.username_loc).send_keys(username) def enter_password(self,password): self.find_element(*self.password_loc).send_keys(password) def submit(self): self.find_element(*self.submit_loc).click()
执行测试函数:
def test_login_Y(driver,username,password): login_page=LoginPage(driver) login_page.open() login_page.enter_username(username) login_page.enter_password(password) login_page.submit() if __name__ == "__main__": driver = webdriver.Chrome("C:\\Users\\dewi\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe") username = 'standard_user' password = 'secret_sauce' test_login_Y(driver, username, password) time.sleep(3) UIResult = driver.find_element_by_xpath('//*[@id="header_container"]/div[2]/span').text assert ("Products" == UIResult), "密码正确登录验证失败,fail" driver.quit()
今天就先学习到这里吧。后面我们再做优化,如PO模式和数据驱动整合在一起,自动输出HTML报告等。
每天进步一点点,加油!