写在前面:在研究po模式拆分时,在网上找了大量的资料,基本都是提供思路及结果,对于如果一步一步如果从线性脚本到函数再到po模式转化的文章少之又少,类似于小白的同学到这一个过程无疑是痛苦的,这种经历只有体会过的同学才会懂。
这篇文章是我在参考大量视频、网上资料、自己实践总结出来的,希望读完后大家有所收获。
1.什么是PO模式
PO是一种设计模式,核心思想是每个页面定义一个单独的类,类中包含元素所需要的对象及方法
2.PO模式优点
·使代码结构清晰:po模式使页面元素操作和业务流程相分离
·方便复用:相同功能可多次调用
·页面元素发生变化时,直接修改封装好的页面元素就可以
3.实例演示PO模式拆分
本例采用三层模式,对象库层+逻辑层+业务数据层
对象库层:base层,封装常用的方法如click,doubleclick,元素定位,功能封装等
逻辑层:页面功能逻辑实现
业务数据层:通过传入参数,调用逻辑层功能
4.代码实现逻辑
首先,整个功能线性脚本编写实现
其次,线性脚本到函数封装
最后,函数拆分都不同层次页面
目的:一个线性脚本test_2_modify_plan.py文件拆分成上图中的3个文件内
4.1 线性脚本
源码1.0版本:这部分仅仅实现登录->新建->填写数据->提交这一过程。
from selenium import webdriver #导入webdriver from time import sleep #导入sleep from selenium.webdriver.common.action_chains import ActionChains#导入ActionChains from page_object.LoginPage import * #导入page_object文件夹下的LoginPage函数,登录功能 from selenium.webdriver.support.select import Select #导入Select 方法 from model import function,myunit #从model文件夹导入 function,myunit函数 #打开chrome浏览器 chrome_options = webdriver.ChromeOptions() chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']) driver = webdriver.Chrome(options=chrome_options) driver.get("http://127.0.0.1:8080/portal-web/framework/login?") driver.maximize_window() 输入用户名、密码ver.find_element_by_name("username").send_keys('b') driver.find_element_by_id('password').send_keys('11qq!!') driver.find_element_by_id('dlu').click() sleep(3) ul1#进入三级目录=driver.find_element_by_xpath("//*[text()='质量基础']") ActionChains(driver).double_click(ul1).perform() ul2=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证']") ActionChains(driver).double_click(ul2).perform() ul3=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证计划']") ActionChains(driver).double_click(ul3).perform() sleep(3) #主页面点击新建 driver.switch_to.frame('data_iframe') driver.find_element_by_xpath('//*[@id="grid"]/div[1]/a[1]').click() sleep(3) # 第二个iframe填写内容新建 #下拉菜单非select类型,直接定位选择内容 iframe1 = driver.find_element_by_xpath('//*[@title="新建页面"]') driver.switch_to.frame(iframe1) iframe2=driver.find_element_by_xpath("//iframe[contains(@src,'/quality-web/certifischeController/input')]") driver.switch_to.frame(iframe2) driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[2]/td[8]/span/span/span[1]').click() sleep(2) driver.find_element_by_xpath("//*[text()='2020财年当年4月']").click() sleep(2) driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[2]/span/span').click() sleep(1) driver.find_element_by_xpath("//*[text()='111']").click() sleep(1) #完成时间控件选择 js = "$('.kendoDate').removeAttr('readonly')" # jQuery,移除属性 driver.execute_script(js) input_datetime = driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span') sleep(2) driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span/input').send_keys("2020-06-22") #认证日期 driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[7]/span/span/input').send_keys('2020-06-22') driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[8]/span/span/input').send_keys('2020-06-22') #文本框输入 driver.find_element_by_xpath('//*[@data-isq="工作项目"]').send_keys("您好") sleep(1) driver.find_element_by_xpath('//*[@data-isq="详细计划"]').send_keys("您好") sleep(1) # drer.find_element_by_xpath('//*[@data-isq="供应商名称"]').send_keys("您好") sleep(1) driver.find_element_by_xpath('//*[@data-isq="制造地址/邮编"]').send_keys("您好") sleep(1) driver.find_element_by_xpath('//*[@data-isq="电话/传真"]').send_keys("您好") sleep(1) driver.find_element_by_xpath('//*[@data-isq="认证产品"]').send_keys("您好") sleep(1) #树形结构 #批准人 driver.find_element_by_xpath('//*[@data-isq="计划审核人"]').click() people=driver.find_element_by_xpath('//*[@title="人员选择"]') driver.switch_to.frame(people) sleep(2) driver.find_element_by_id('searchbox').send_keys('b') sleep(2) driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click() sleep(2) driver.find_element_by_xpath('//*[@id="okButton"]').click() sleep(2) #计划批准人 driver.switch_to.parent_frame() driver.find_element_by_xpath('//*[@data-isq="计划批准人"]').click() people=driver.find_element_by_xpath('//*[@title="人员选择"]') driver.switch_to.frame(people) sleep(2) driver.find_element_by_id('searchbox').send_keys('b') sleep(2) driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click() sleep(2) driver.find_element_by_xpath('//*[@id="okButton"]').click() sleep(2) #担当人 driver.switch_to.parent_frame() driver.find_element_by_xpath('//*[@data-isq="担当人"]').click() people=driver.find_element_by_xpath('//*[@title="人员选择"]') driver.switch_to.frame(people) sleep(2) driver.find_element_by_id('searchbox').send_keys('b') sleep(2) driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click() sleep(2) driver.find_element_by_xpath('//*[@id="okButton"]').click() sleep(2) #跳回frame1 driver.switch_to.parent_frame() driver.switch_to.parent_frame() driver.find_element_by_id("buttons2").click() driver.find_element_by_xpath('//*[@id="header"]/div[2]/div[2]/span[4]/a').click() driver.switch_to.default_content() #切换其他窗体 driver.quit() |
4.2 函数封装
1) 重构-元素定位优化
将1.0代码内容进行重构,基本思路按功能实现先对元素定位进行函数封装,再进行调用
·封装定位方法
·功能区调用封装好的方法
·建议每次改写一个小功能,改写完成后进行调试,切近全部一次性改写,工作量太大。
·在原有py文件旁在新建一个py文件,每次拷贝一小段功能进行改写
代码2.0版本
将代码用函数封装起来:
from selenium import webdriver from time import sleep from selenium.webdriver.common.action_chains import ActionChains from page_object.LoginPage import * from selenium.webdriver.support.select import Select from model import function,myunit # chrome_options = webdriver.ChromeOptions() # chrome_options.add_experimental_option("excludeSwitches", ['enable-automation']) #driver = webdriver.Chrome() driver=webdriver.Firefox() driver.get("http://127.0.0.1:8080/portal-web/framework/login?") driver.maximize_window() #函数封装 def ty_name(driver,na): return driver.find_element_by_name(na) def ty_id(driver,i): return driver.find_element_by_id(i) def ty_xpath(driver,xxpath): return driver.find_element_by_xpath(xxpath) # def double_click(driver,element): return ActionChains(driver).double_click(element).perform def ty_switch_to_frame(driver,frame): return driver.switch_to.frame(frame) def ty_switch_to_default_frame(driver): return driver.switch_to.default_content() def ty_switch_to_parent_frame(driver): return driver.switch_to.parent_frame() def js(driver,ele): driver.execute_script("$("+"'"+ele+"'"+").removeAttr('readonly')") js(driver,'.kendoDate') #登录功能 ty_name(driver,"username").send_keys('b') ty_id(driver,'password').send_keys('11qq!!') ty_id(driver,'dlu').click() sleep(3) #目录导航 ul1=driver.find_element_by_xpath("//*[text()='质量基础']") ActionChains(driver).double_click(ul1).perform() ul2=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证']") ActionChains(driver).double_click(ul2).perform() ul3=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证计划']") ActionChains(driver).double_click(ul3).perform() sleep(1) #主页面点击新建 #主页frame,点击新建按钮 ty_switch_to_frame(driver,'data_iframe') ty_xpath(driver,'//*[@id="grid"]/div[1]/a[1]').click() sleep(3) # 第二个iframe填写内容新建 #下拉菜单非select类型,直接定位选择内容 iframe1 = ty_xpath(driver,'//*[@title="新建页面"]') ty_switch_to_frame(driver,iframe1) sleep(1) iframe2 = ty_xpath(driver,"//iframe[contains(@src,'/quality-web/certifischeController/input')]") ty_switch_to_frame(driver,iframe2) sleep(1) #选择年份 ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[2]/td[8]/span/span/span[1]').click() sleep(1) ty_xpath(driver,"//*[text()='2020财年当年4月']").click() #工作类别 sleep(1) ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[3]/td[2]/span/span').click() sleep(1) ty_xpath(driver,"//*[text()='111']").click() sleep(1) #完成时间控件选择 input_datetime=ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span') sleep(2) ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span/input').send_keys("2020-06-22") #认证日期 ty_xpath(driver,'//*[@id="mybody"]/tr/td[7]/span/span/input').send_keys('2020-06-22') ty_xpath(driver,'//*[@id="mybody"]/tr/td[8]/span/span/input').send_keys('2020-06-22') #文本框输入 ty_xpath(driver,'//*[@data-isq="工作项目"]').send_keys("您好") sleep(1) ty_xpath(driver,'//*[@data-isq="详细计划"]').send_keys("您好") sleep(1) # ty_xpath(driver,'//*[@data-isq="供应商名称"]').send_keys("您好") sleep(1) ty_xpath(driver,'//*[@data-isq="制造地址/邮编"]').send_keys("您好") sleep(1) ty_xpath(driver,'//*[@data-isq="电话/传真"]').send_keys("您好") sleep(1) ty_xpath(driver,'//*[@data-isq="认证产品"]').send_keys("您好") sleep(1) #树形结构 #批准人 ty_xpath(driver,'//*[@data-isq="计划审核人"]').click() people=ty_xpath(driver,'//*[@title="人员选择"]') ty_switch_to_frame(driver,people) sleep(1) ty_id(driver,'searchbox').send_keys('b') sleep(1) ty_xpath(driver,'//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click() sleep(1) ty_xpath(driver,'//*[@id="okButton"]').click() sleep(1) #计划批准人 driver.switch_to.parent_frame() sleep(1) ty_xpath(driver,'//*[@data-isq="计划批准人"]').click() people=ty_xpath(driver,'//*[@title="人员选择"]') sleep(1) ty_switch_to_frame(driver,people) sleep(1) ty_id(driver,'searchbox').send_keys('b') sleep(1) ty_xpath(driver,'//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click() sleep(1) ty_xpath(driver,'//*[@id="okButton"]').click() sleep(1) #担当人 ty_switch_to_parent_frame(driver) ty_xpath(driver,'//*[@data-isq="担当人"]').click() people=ty_xpath(driver,'//*[@title="人员选择"]') ty_switch_to_frame(driver,people) sleep(1) ty_id(driver,'searchbox').send_keys('b') sleep(1) ty_xpath(driver,'//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click() sleep(1) ty_xpath(driver,'//*[@id="okButton"]').click() sleep(1) #跳回frame1 ty_switch_to_parent_frame(driver) ty_switch_to_parent_frame(driver) ty_id(driver,"buttons2").click() ty_xpath(driver,'//*[@id="header"]/div[2]/div[2]/span[4]/a').click() ty_switch_to_default_frame(driver) #切换其他窗体 driver.quit() |
版权声明:本文出自《51测试天地》第五十九期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任