51Testing软件测试论坛

标题: Python Selenium自动化进阶线性脚本到PO模式拆分 [打印本页]

作者: lsekfe    时间: 2020-11-2 09:22
标题: Python Selenium自动化进阶线性脚本到PO模式拆分
写在前面:在研究po模式拆分时,在网上找了大量的资料,基本都是提供思路及结果,对于如果一步一步如果从线性脚本到函数再到po模式转化的文章少之又少,类似于小白的同学到这一个过程无疑是痛苦的,这种经历只有体会过的同学才会懂。
  这篇文章是我在参考大量视频、网上资料、自己实践总结出来的,希望读完后大家有所收获。
[attach]130457[/attach]       1.什么是PO模式
  PO是一种设计模式,核心思想是每个页面定义一个单独的类,类中包含元素所需要的对象及方法
  2.PO模式优点
  ·使代码结构清晰:po模式使页面元素操作和业务流程相分离
  ·方便复用:相同功能可多次调用
  ·页面元素发生变化时,直接修改封装好的页面元素就可以
  3.实例演示PO模式拆分
  本例采用三层模式,对象库层+逻辑层+业务数据层
  对象库层:base层,封装常用的方法如click,doubleclick,元素定位,功能封装等
  逻辑层:页面功能逻辑实现
  业务数据层:通过传入参数,调用逻辑层功能
  4.代码实现逻辑
  首先,整个功能线性脚本编写实现
  其次,线性脚本到函数封装
  最后,函数拆分都不同层次页面
  目的:一个线性脚本test_2_modify_plan.py文件拆分成上图中的3个文件内
  4.1 线性脚本
  源码1.0版本:这部分仅仅实现登录->新建->填写数据->提交这一过程。

  1.  from selenium import webdriver  #导入webdriver

  2.   from time import sleep #导入sleep

  3.   from selenium.webdriver.common.action_chains import ActionChains#导入ActionChains

  4.   from page_object.LoginPage import * #导入page_object文件夹下的LoginPage函数,登录功能

  5.   from selenium.webdriver.support.select import Select  #导入Select 方法

  6.   from model import function,myunit #从model文件夹导入 function,myunit函数

  7.   #打开chrome浏览器

  8.   chrome_options = webdriver.ChromeOptions()

  9.   chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])

  10.   driver = webdriver.Chrome(options=chrome_options)

  11.   driver.get("http://127.0.0.1:8080/portal-web/framework/login?")

  12.   driver.maximize_window()

  13.   输入用户名、密码ver.find_element_by_name("username").send_keys('b')

  14.   driver.find_element_by_id('password').send_keys('11qq!!')

  15.   driver.find_element_by_id('dlu').click()

  16.   sleep(3)

  17.   ul1#进入三级目录=driver.find_element_by_xpath("//*[text()='质量基础']")

  18.   ActionChains(driver).double_click(ul1).perform()

  19.   ul2=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证']")

  20.   ActionChains(driver).double_click(ul2).perform()

  21.   ul3=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证计划']")

  22.   ActionChains(driver).double_click(ul3).perform()

  23.   sleep(3)

  24.   #主页面点击新建

  25.   driver.switch_to.frame('data_iframe')

  26.   driver.find_element_by_xpath('//*[@id="grid"]/div[1]/a[1]').click()

  27.   sleep(3)

  28.   # 第二个iframe填写内容新建

  29.   #下拉菜单非select类型,直接定位选择内容

  30.   iframe1 = driver.find_element_by_xpath('//*[@title="新建页面"]')

  31.   driver.switch_to.frame(iframe1)

  32.   iframe2=driver.find_element_by_xpath("//iframe[contains(@src,'/quality-web/certifischeController/input')]")

  33.   driver.switch_to.frame(iframe2)

  34.   driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[2]/td[8]/span/span/span[1]').click()

  35.   sleep(2)

  36.   driver.find_element_by_xpath("//*[text()='2020财年当年4月']").click()

  37.   sleep(2)

  38.   driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[2]/span/span').click()

  39.   sleep(1)

  40.   driver.find_element_by_xpath("//*[text()='111']").click()

  41.   sleep(1)

  42.   #完成时间控件选择

  43.   js = "$('.kendoDate').removeAttr('readonly')"  # jQuery,移除属性

  44.   driver.execute_script(js)

  45.   input_datetime = driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span')

  46.   sleep(2)

  47.   driver.find_element_by_xpath('//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span/input').send_keys("2020-06-22")

  48.   #认证日期

  49.   driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[7]/span/span/input').send_keys('2020-06-22')

  50.   driver.find_element_by_xpath('//*[@id="mybody"]/tr/td[8]/span/span/input').send_keys('2020-06-22')

  51.   #文本框输入

  52.   driver.find_element_by_xpath('//*[@data-isq="工作项目"]').send_keys("您好")

  53.   sleep(1)

  54.   driver.find_element_by_xpath('//*[@data-isq="详细计划"]').send_keys("您好")

  55.   sleep(1)

  56.   #

  57.   drer.find_element_by_xpath('//*[@data-isq="供应商名称"]').send_keys("您好")

  58.   sleep(1)

  59.   driver.find_element_by_xpath('//*[@data-isq="制造地址/邮编"]').send_keys("您好")

  60.   sleep(1)

  61.   driver.find_element_by_xpath('//*[@data-isq="电话/传真"]').send_keys("您好")

  62.   sleep(1)

  63.   driver.find_element_by_xpath('//*[@data-isq="认证产品"]').send_keys("您好")

  64.   sleep(1)

  65.   #树形结构

  66.   #批准人

  67.   driver.find_element_by_xpath('//*[@data-isq="计划审核人"]').click()

  68.   people=driver.find_element_by_xpath('//*[@title="人员选择"]')

  69.   driver.switch_to.frame(people)

  70.   sleep(2)

  71.   driver.find_element_by_id('searchbox').send_keys('b')

  72.   sleep(2)

  73.   driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()

  74.   sleep(2)

  75.   driver.find_element_by_xpath('//*[@id="okButton"]').click()

  76.   sleep(2)

  77.   #计划批准人

  78.   driver.switch_to.parent_frame()

  79.   driver.find_element_by_xpath('//*[@data-isq="计划批准人"]').click()

  80.   people=driver.find_element_by_xpath('//*[@title="人员选择"]')

  81.   driver.switch_to.frame(people)

  82.   sleep(2)

  83.   driver.find_element_by_id('searchbox').send_keys('b')

  84.   sleep(2)

  85.   driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()

  86.   sleep(2)

  87.   driver.find_element_by_xpath('//*[@id="okButton"]').click()

  88.   sleep(2)

  89.   #担当人

  90.   driver.switch_to.parent_frame()

  91.   driver.find_element_by_xpath('//*[@data-isq="担当人"]').click()

  92.   people=driver.find_element_by_xpath('//*[@title="人员选择"]')

  93.   driver.switch_to.frame(people)

  94.   sleep(2)

  95.   driver.find_element_by_id('searchbox').send_keys('b')

  96.   sleep(2)

  97.   driver.find_element_by_xpath('//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()

  98.   sleep(2)

  99.   driver.find_element_by_xpath('//*[@id="okButton"]').click()

  100.   sleep(2)

  101.   #跳回frame1

  102.   driver.switch_to.parent_frame()

  103.   driver.switch_to.parent_frame()

  104.   driver.find_element_by_id("buttons2").click()

  105.   driver.find_element_by_xpath('//*[@id="header"]/div[2]/div[2]/span[4]/a').click()

  106.   driver.switch_to.default_content()

  107.   #切换其他窗体

  108.   driver.quit()
复制代码
 4.2 函数封装
  1) 重构-元素定位优化
  将1.0代码内容进行重构,基本思路按功能实现先对元素定位进行函数封装,再进行调用
  ·封装定位方法
  ·功能区调用封装好的方法
  ·建议每次改写一个小功能,改写完成后进行调试,切近全部一次性改写,工作量太大。
  ·在原有py文件旁在新建一个py文件,每次拷贝一小段功能进行改写
  代码2.0版本
  将代码用函数封装起来:

  1. from selenium import webdriver

  2.   from time import sleep

  3.   from selenium.webdriver.common.action_chains import ActionChains

  4.   from page_object.LoginPage import *

  5.   from selenium.webdriver.support.select import Select

  6.   from model import function,myunit

  7.   # chrome_options = webdriver.ChromeOptions()

  8.   # chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])

  9.   #driver = webdriver.Chrome()

  10.   driver=webdriver.Firefox()

  11.   driver.get("http://127.0.0.1:8080/portal-web/framework/login?")

  12.   driver.maximize_window()

  13.   #函数封装

  14.   def ty_name(driver,na):

  15.       return driver.find_element_by_name(na)

  16.   def ty_id(driver,i):

  17.       return driver.find_element_by_id(i)

  18.   def ty_xpath(driver,xxpath):

  19.       return driver.find_element_by_xpath(xxpath)

  20.   #

  21.   def double_click(driver,element):

  22.       return ActionChains(driver).double_click(element).perform

  23.   def ty_switch_to_frame(driver,frame):

  24.       return driver.switch_to.frame(frame)

  25.   def ty_switch_to_default_frame(driver):

  26.       return driver.switch_to.default_content()

  27.   def ty_switch_to_parent_frame(driver):

  28.       return driver.switch_to.parent_frame()

  29.   def js(driver,ele):

  30.       driver.execute_script("$("+"'"+ele+"'"+").removeAttr('readonly')")

  31.   js(driver,'.kendoDate')

  32.   #登录功能

  33.   ty_name(driver,"username").send_keys('b')

  34.   ty_id(driver,'password').send_keys('11qq!!')

  35.   ty_id(driver,'dlu').click()

  36.   sleep(3)

  37.   #目录导航

  38.   ul1=driver.find_element_by_xpath("//*[text()='质量基础']")

  39.   ActionChains(driver).double_click(ul1).perform()

  40.   ul2=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证']")

  41.   ActionChains(driver).double_click(ul2).perform()

  42.   ul3=driver.find_element_by_xpath("//*[text()='供应商产品质量维持认证计划']")

  43.   ActionChains(driver).double_click(ul3).perform()

  44.   sleep(1)

  45.   #主页面点击新建

  46.   #主页frame,点击新建按钮

  47.   ty_switch_to_frame(driver,'data_iframe')

  48.   ty_xpath(driver,'//*[@id="grid"]/div[1]/a[1]').click()

  49.   sleep(3)

  50.   # 第二个iframe填写内容新建

  51.   #下拉菜单非select类型,直接定位选择内容

  52.   iframe1 = ty_xpath(driver,'//*[@title="新建页面"]')

  53.   ty_switch_to_frame(driver,iframe1)

  54.   sleep(1)

  55.   iframe2 = ty_xpath(driver,"//iframe[contains(@src,'/quality-web/certifischeController/input')]")

  56.   ty_switch_to_frame(driver,iframe2)

  57.   sleep(1)

  58.   #选择年份

  59.   ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[2]/td[8]/span/span/span[1]').click()

  60.   sleep(1)

  61.   ty_xpath(driver,"//*[text()='2020财年当年4月']").click()

  62.   #工作类别

  63.   sleep(1)

  64.   ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[3]/td[2]/span/span').click()

  65.   sleep(1)

  66.   ty_xpath(driver,"//*[text()='111']").click()

  67.   sleep(1)

  68.   #完成时间控件选择

  69.   input_datetime=ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span')

  70.   sleep(2)

  71.   ty_xpath(driver,'//*[@id="myform"]/table/tbody/tr[3]/td[4]/span/span/input').send_keys("2020-06-22")

  72.   #认证日期

  73.   ty_xpath(driver,'//*[@id="mybody"]/tr/td[7]/span/span/input').send_keys('2020-06-22')

  74.   ty_xpath(driver,'//*[@id="mybody"]/tr/td[8]/span/span/input').send_keys('2020-06-22')

  75.   #文本框输入

  76.   ty_xpath(driver,'//*[@data-isq="工作项目"]').send_keys("您好")

  77.   sleep(1)

  78.   ty_xpath(driver,'//*[@data-isq="详细计划"]').send_keys("您好")

  79.   sleep(1)

  80.   #

  81.   ty_xpath(driver,'//*[@data-isq="供应商名称"]').send_keys("您好")

  82.   sleep(1)

  83.   ty_xpath(driver,'//*[@data-isq="制造地址/邮编"]').send_keys("您好")

  84.   sleep(1)

  85.   ty_xpath(driver,'//*[@data-isq="电话/传真"]').send_keys("您好")

  86.   sleep(1)

  87.   ty_xpath(driver,'//*[@data-isq="认证产品"]').send_keys("您好")

  88.   sleep(1)

  89.   #树形结构

  90.   #批准人

  91.   ty_xpath(driver,'//*[@data-isq="计划审核人"]').click()

  92.   people=ty_xpath(driver,'//*[@title="人员选择"]')

  93.   ty_switch_to_frame(driver,people)

  94.   sleep(1)

  95.   ty_id(driver,'searchbox').send_keys('b')

  96.   sleep(1)

  97.   ty_xpath(driver,'//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()

  98.   sleep(1)

  99.   ty_xpath(driver,'//*[@id="okButton"]').click()

  100.   sleep(1)

  101.   #计划批准人

  102.   driver.switch_to.parent_frame()

  103.   sleep(1)

  104.   ty_xpath(driver,'//*[@data-isq="计划批准人"]').click()

  105.   people=ty_xpath(driver,'//*[@title="人员选择"]')

  106.   sleep(1)

  107.   ty_switch_to_frame(driver,people)

  108.   sleep(1)

  109.   ty_id(driver,'searchbox').send_keys('b')

  110.   sleep(1)

  111.   ty_xpath(driver,'//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()

  112.   sleep(1)

  113.   ty_xpath(driver,'//*[@id="okButton"]').click()

  114.   sleep(1)

  115.   #担当人

  116.   ty_switch_to_parent_frame(driver)

  117.   ty_xpath(driver,'//*[@data-isq="担当人"]').click()

  118.   people=ty_xpath(driver,'//*[@title="人员选择"]')

  119.   ty_switch_to_frame(driver,people)

  120.   sleep(1)

  121.   ty_id(driver,'searchbox').send_keys('b')

  122.   sleep(1)

  123.   ty_xpath(driver,'//*[@id="myeorgrid"]/div[2]/table/tbody/tr[1]/td[2]').click()

  124.   sleep(1)

  125.   ty_xpath(driver,'//*[@id="okButton"]').click()

  126.   sleep(1)

  127.   #跳回frame1

  128.   ty_switch_to_parent_frame(driver)

  129.   ty_switch_to_parent_frame(driver)

  130.   ty_id(driver,"buttons2").click()

  131.   ty_xpath(driver,'//*[@id="header"]/div[2]/div[2]/span[4]/a').click()

  132.   ty_switch_to_default_frame(driver)

  133.   #切换其他窗体

  134.   driver.quit()
复制代码



作者: Miss_love    时间: 2020-12-25 13:38
支持分享




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2