51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2258|回复: 1
打印 上一主题 下一主题

Python Selenium自动化进阶线性脚本到PO模式拆分

[复制链接]
  • TA的每日心情
    无聊
    前天 09:05
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2020-11-2 09:22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    写在前面:在研究po模式拆分时,在网上找了大量的资料,基本都是提供思路及结果,对于如果一步一步如果从线性脚本到函数再到po模式转化的文章少之又少,类似于小白的同学到这一个过程无疑是痛苦的,这种经历只有体会过的同学才会懂。
      这篇文章是我在参考大量视频、网上资料、自己实践总结出来的,希望读完后大家有所收获。
           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()
    复制代码


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 04:45 , Processed in 0.067578 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表