用python版selenium来拯救测试小姐姐

最近参与的项目进入集中测试阶段了,可怜各位测试小姐姐还要手动输入各种数据,真是不能忍啊。这种时候就需要我们程序猿出场了,使用各种高科技来拯救小姐姐吧。

python版的selenium来实现一个简单的自动化程序很简单,具体selenium的使用教程也不用赘述了,官网文档描述的很清楚了,附上链接供大家参考Selenium 浏览器自动化项目

言归正传,该项目名为AutoTest 可配置自动化测试工具使用,python+selenium实现的可配置自动化测试工具,只要稍微了解HTML及相关查询器的知识,就可以通过书写测试流程文件来完成测试流程定制,表单自动填写,按钮点击,流程截图,键盘事件,浏览器缓存操作等功能,目前仅支持Chrome, IE浏览器。

项目地址AutoTest 可配置自动化测试工具

启动方法

  • 开发环境运行

    • 本地环境请预先安装好python3.8,下载项目到本地任意文件夹,使用pip安装pipenv包,使用vscode加载项目后,在控制台输入pipenv shell建立独立开发环境,然后输入pipenv install完成项目所需包安装。
    • 本地添加如下lauch.json启动文件
      {
          "version": "0.2.0",
          "configurations": [
              {
                  "name": "Python: Current File",
                  "type": "python",
                  "request": "launch",
                  "program": "${workspaceFolder}/autotest.py",
                  "console": "integratedTerminal"
              }
          ]
      }
      
    • 点击F5即可启动本项目。
  • exe文件运行

    • 在完成开发环境配置后,可以通过项目中提供的run.bat文件来生成exe可执行文件来启动项目。

使用说明

  • 相关配置文件

    • autotest.yaml 项目全局配置文件,配置诸如默认启动浏览器,是否使用代理等。
    • logger.yaml 日志配置文件,配置日志等级及输出类型
    • const.yaml 常量定义,在自定义测试流程时使用
  • 流程文件定义说明

    • 流程文件是json格式文件,所有文件都必须放到项目根目录下的flowdata文件夹下,文件名取名任意,前缀为cmn_XXXX.json的文件将做为通用流程文件,提供给其他流程文件使用,不会直接加载到项目可执行流程文件中。
    • 如下代码所示,每一个键值对代表一个操作步骤,字典键无具体意义,可作为操作提示备注信息,type指定操作类型,这里的open是指的打开具体网址操作,targeturl表示目标网址,option表示当前操作后的一些额外动作,例如此处的{ "type": "wait", "params": 5}为停顿5秒。
      {
        "打开简书": {
          "type": "open",
          "targeturl": "https://www.jianshu.com/",
          "option": { "type": "wait", "params": 5}
        }
      }
      
    • type包括以下类型
      • open 打开指定网址。
        • 必要属性:targeturl指定目标网站地址;
        • 可选属性:
          • option指定当前操作完成后的一些额外操作,包括refresh刷新页面,wait停顿,close关闭浏览器,switch切换窗口,screenshot截图;
          • doafter指定完成操作后的子操作,语法和父节点一致。
      • read 读取指定mock数据文件。
        • 必要属性:
          • findmethod指定页面元素使用的选择器,包括ID,XPATH,LINK_TEXT,PARTIAL_LINK_TEXT,NAME,TAG_NAME,CLASS_NAME,CSS_SELECTOR
          • targeturl指定读取目标mock文件地址。mock文件作为流程中需要使用的共通数据文件,统一放置在mockdata文件夹中,mock文件格式也为json格式,其中的字典键对应与findmethod相匹配的查询表达式。
        • 可选属性:optiondoafter
      • click 处理页面元素单击操作。
        • 必要属性:findmethodtarget指定与findmethod相匹配的查询表达式;
        • 可选属性:
          • count指定点击次数,默认为1次;
          • index通过指定索引值从匹配元素集中找到对应元素
          • option
          • doafter
      • dbclick 处理页面元素双击操作。
        • 必要属性:findmethodtarget
        • 可选属性:optiondoafter
      • alert 弹出对话框确认操作。系统中有时在点击关键按钮时会出现相关操作确认提示框,通过配置该节点默认确认进入下一节点。
        • 可选属性:optiondoafter
      • copy 将匹配值复制到剪贴板中,以备后续使用。
        • 必要属性:
          • 通过指定findmethodtarget组合,可以复制页面指定元素值到剪贴板中;
          • 通过指定itemval,可以复制其对应值到剪贴板中,itemval支持设置常量值,如copy操作配置在某循环中,也可通过指定format来完成动态值设置。
        • 可选属性:optiondoafter
      • paste 将剪贴板值设置给页面指定元素。
        • 必要属性:findmethodtarget
        • 可选属性:optiondoafter
      • for 循环操作。
        • 必要属性:
          • 通过指定startidxendidx组合,完成指定范围的索引循环,其当前索引值可作为动态值提供给循环体内子节点使用;
          • 通过指定findmethodtarget组合,完成对页面匹配元素集的循环操作,当前元素值可提供给循环体内子节点使用。当循环体内click子节点未指定元素时,会使用循环中的当前元素进行单击操作。
          • flow定义了循环体要处理的子节点集合。
        • 可选属性:optiondoafter
      • cache 设置浏览器缓存。
        • 必要属性:
          • cachekey指定浏览器缓存键;
          • itemval指定缓存键对应的值。
        • 可选属性:optiondoafter
      • setval 区别于read多项目读取,该操作为对页面单项目的值设定,主要用于设置上传文件,动态值设定等。
        • 必要属性:findmethodtarget, itemval
        • 可选属性:optiondoafter
      • flowfile 加载共通流程模板文件。
        • 必要属性:targeturl
        • 可选属性:optiondoafter
      • keyboard 键盘操作。多用于点击键盘PAGE_DOWN事件完成页面滚动等,不支持键盘键组合。
        • 必要属性:
          • 通过指定findmethodtarget组合,在指定页面元素上施加对应键盘操作。
          • itemval指定键盘键值;
        • 可选属性:optiondoafter
    • 其他属性说明
      • option包括无参命令,有参命令,也可以通过数组形式包括多个命令。
        • 无参命令:
          • {"option":"refresh"} 刷新浏览器
          • {"option":"close"} 关闭浏览器
          • {"option":"screenshot"} 当前显示窗口截屏
        • 有参命令
          • {"option": { "type": "wait", "params": 5} } 执行等待,等待时间由params参数指定。多用于解决页面加载缓慢问题。
          • {"option": { "type": "switch", "params": "new"} } 切换到新开窗口;{"option": { "type": "switch", "params": "origin"} } 关闭新窗口后,切换回原始窗口
          • 截取页面全屏,params指定参数数组,第一个参数为页面中需要处理的漂浮元素,xpath指定查询元素方式,当前支持id=xxxclass=yyy, tag=zzz等3种方式,display_page表示漂浮元素要显示的位置,一般情况下漂浮元素如简书的头需要显示在截屏的首页则设置为first,如简书的返回顶部按钮需要显示在截屏的尾页则设置为last,截取全屏功能仅通过Chrome测试;第二个参数为指定是否需要预先加载完页面,例如简书首页文章列表随着滚动加载,如需要截取全屏则需要设置为True,反之对于一次性加载的页面则设置为False
            {
              "type": "screenshot",
              "params": [
                [
                  { "xpath":"tag=nav", "display_page":"first"},
                  { "xpath":"class=side-tool", "display_page":"last"}
                ],
                "True"
              ]
            }
            
    • bat文件说明
      • run.bat 执行后会在项目根目录生成dist文件夹,里面包含了项目可执行程序exe等相关文件。执行打包前,请先进入pipenv所创建的独立环境后,再请执行命令pip install pyinstaller安装对应包。
      • zip.bat 使用windows自带压缩软件,压缩浏览器代理插件用的压缩文件,使用前请先修改proxy文件下的代理配置文件background.js,直接cmd中进入项目目录输入zip命令执行。

简书点赞流程文件解析

{
  "打开简书": {
    "type": "open",
    "targeturl": "https://www.jianshu.com/",
    "option": { "type": "wait", "params": 5}
  },
  "添加cookie": {
    "type": "cache",
    "cachekey": "remember_user_token",
    "itemval": "输入账户登陆后的token值",
    "option": ["refresh", {
      "type": "wait",
      "params": 5
    }, {
      "type": "screenshot",
      "params": [
        [
          { "xpath":"tag=nav", "display_page":"first"},
          { "xpath":"class=side-tool", "display_page":"last"}
        ],
        "True"
      ]
    }]
  },
  "循环点击文章列表": {
    "type": "for",
    "findmethod": "CSS_SELECTOR",
    "target": "#list-container>ul.note-list>li>div.content>a.title",
    "flow": {
      "打开文章": {
        "type": "click",
        "option": {
          "type": "switch",
          "params": "new"
        }
      },
      "文章点赞": {
        "type": "click",
        "findmethod": "CLASS_NAME",
        "target": "_2VdqdF",
        "index": 0,
        "option": {
          "type": "switch",
          "params": "origin"
        }
      }
    }
  }
}

该流程文件包含了3个节点,第一个节点表示打开简书网站;第二个节点操作缓存,简书网站在你登陆以后会在浏览器缓存的remember_user_token中记录你的token值,通过手动添加该缓存即可自动登陆,同时在添加完缓存后,需要按序执行额外的一些操作,刷新浏览器让登陆状态生效,截取文章列表全屏(此处另一个目的是为了加载完全部文章以备后续点赞用);第三个节点通过CSS_SELECTOR选择器,查找所有文章列表,并循环该列表完成后续点赞操作。子节点打开文章,由于没有指定查找匹配元素方式,则默认会点击循环当前元素即当前文章,额外操作中完成切换到新窗口,子节点文章点赞则完成单击点赞按钮后,在额外操作中关掉当前窗口并切换回主窗口。

下面是程序运行后的启动界面,选中流程文件,点击启动即可。


被拯救的小姐姐很满意,奖励了一根鸡腿。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350