python selenium 关键字驱动开源

说明

最新的selenium3 python3的开源优化

使用

配置yamls下的config的url

url: https://testerhome.com/

命令运行

python runner.py
  • 或者修改start.test.bat中的路径后,直接点击运行

结果展示

日志目录

  • 文件夹:chrome_XXXXX,包含截图
2018-04-29 23:28:09,357  - INFO - ----  test001_登录失败_div.container>ul>li:nth-child(2)_css_click_         ----
2018-04-29 23:28:09,970  - INFO - ----  test001_登录失败_input-lg_class_name_send_keys_lose1        ----
2018-04-29 23:28:10,066  - INFO - ----  test001_登录失败_user_password_id_send_keys_1231231232        ----
2018-04-29 23:28:10,187  - INFO - ----  test001_登录失败_div.form-actions_css_click_         ----
2018-04-29 23:28:10,784  - INFO - ----  test001_登录失败_div.alert-warning_css_ _         ----
2018-04-29 23:28:10,785  - INFO - [CheckPoint_1]: testALoginFail_ : OK
2018-04-29 23:28:36,116  - INFO - ----  test001_登录_div.container>ul>li:nth-child(2)_css_click_         ----
2018-04-29 23:29:41,881  - INFO - ----  test001_登录_input-lg_class_name_send_keys_lose1        ----
2018-04-29 23:30:16,331  - INFO - ----  test001_登录_user_password_id_send_keys_1231231232        ----
2018-04-29 23:30:16,433  - INFO - ----  test001_登录_div.form-actions_css_click_         ----
2018-04-29 23:31:02,425  - INFO - [CheckPoint_2]: testBLogin_==请检查dropdown-avatar==: NG
  • 实时日志

testALoginFail (TestCase.HomeTest.HomeTest) ... ==操作步骤:div.container>ul>li:nth-child(2)_css_click_ ==
==操作步骤:input-lg_class_name_send_keys_lose1==
==操作步骤:user_password_id_send_keys_1231231232==
==操作步骤:div.form-actions_css_click_ ==
==操作步骤:div.alert-warning_css_ _ ==
==用例_登录失败检查点成功==
ok
testBLogin (TestCase.HomeTest.HomeTest) ... ==操作步骤:div.container>ul>li:nth-child(2)_css_click_ ==
==操作步骤:input-lg_class_name_send_keys_lose==
==操作步骤:user_password_id_send_keys_XXXXX==
==操作步骤:div.form-actions_css_click_ ==
==操作步骤:dropdown-avatar_class_name_click_ ==
==操作步骤://ul[@class='dropdown-menu']/li/a[contains(text(),'lose')]_xpath_ _ ==
==用例_登录检查点成功==
[{'caseName': 'testALoginFail', 'step': '点击登录\n输入用户名\n输入密码\n点击登录\n', 'info': '打开testerhome', 'title': '登录失败', 'checkStep': '错误的密码登录不成功\n', 'id': 'test001', 'msg': '', 'name': 'chrome', 'result': '通过'}]
ok
testHotTopic (TestCase.MyTest.MyTest) ... ==操作步骤:div.container>ul>li:nth-child(2)_css_click_ ==
==操作步骤:input-lg_class_name_send_keys_lose==
==操作步骤:user_password_id_send_keys_XXXX==
==操作步骤:div.form-actions_css_click_ ==
==操作步骤:dropdown-avatar_class_name_click_ ==
==操作步骤:dropdown-avatar_class_name_click_ ==
==操作步骤://ul[@class='dropdown-menu']/li/a_xpath_click_ ==
==操作步骤://ul[@class="list-group"]/li[1]/div/a[2]_xpath_get_text_ ==
==操作步骤:ul.list-group > li:nth-child(1) > div.title > a:nth-child(2)_css_click_ ==
==操作步骤:/html/head/title_xpath_get_text_ ==
==用例_热门话题检查点成功==

测试报告

代码简要分析

yml测试用例

testinfo:
    - id: test001
      title: 登录
      info: 打开testerhome
testcase:
    - element_info: div.container>ul>li:nth-child(2)
      find_type: css
      operate_type: click
      info: 点击登录
    - element_info: input-lg
      find_type: class_name
      operate_type: send_keys
      msg: lose
      info: 输入用户名
    - element_info: user_password
      find_type: id
      operate_type: send_keys
      msg: XXXXX
      info: 输入密码
    - element_info: div.form-actions
      find_type: css
      operate_type: click
      info: 点击登录
    - element_info: dropdown-avatar
      find_type: class_name
      operate_type: click
      info: 点击图像

check:
    - element_info: //ul[@class='dropdown-menu']/li/a[contains(text(),'lose')]
      find_type: xpath
      check: default_check(默认可以不传,就是简单的查找页面元素)
      info: 查找用户名成功
  • 关于check下面可以填检查点的类型:
    • CONTRARY = "contrary" # 相反检查点,表示如果检查元素存在就说明失败,如删除后,此元素依然存在
    • CONTRARY_GETVAL = "contrary_getval" # 检查点关键字contrary_getval: 相反值检查点,如果对比成功,说明失败
    • DEFAULT_CHECK = "default_check" # 默认检查点,就是查找页面元素
    • COMPARE = "compare" # 历史数据和实际数据对比

某个用例的page层

class LoginPage:
    def __init__(self, kwargs):
        _init = {"driver": kwargs["driver"], "test_msg": getYam(kwargs["path"]),
                 "logTest": kwargs["logTest"], "caseName": kwargs["caseName"]}
        self.page = Pages.PagesObjects(_init)

    def operate(self):  # 操作步骤
        self.page.operate()

    def checkPoint(self):  # 检查点
        self.page.checkPoint()
  • pages再次封装了一层,主要使用了 setupclass+ self.driver.get重定位的方式
    • 避免用例依赖,并不会每个用例重新启动一个session,重连机制也是这样实现的(后续填坑)
        if kwargs.get("launch", "0") == "0":  # 若为空, 刷新页面
            self.driver.get(self.driver.current_url)

testcase层调用page层

cclass HomeTest(ParametrizedTestCase):
    def testALoginFail(self):
        app = {"logTest": self.logTest, "driver": self.driver, "path": PATH("../Yamls/home/LoginFail.yaml"),
               "caseName": sys._getframe().f_code.co_name}

        page = LoginFailPage(app)
        page.operate()
        page.checkPoint()

    def testBLogin(self):
        app = {"logTest": self.logTest, "driver": self.driver, "path": PATH("../Yamls/home/Login.yaml"),
               "caseName": sys._getframe().f_code.co_name}

        page = LoginPage(app)
        page.operate()
        page.checkPoint()

封装自己的关键字

  • 在BaseOperate中定义自己的关键字

    def operate_by(self, operate, testInfo, logTest):
       ...........
            elements = {
                be.CLICK: lambda: self.click(operate),
                be.GET_VALUE: lambda: self.get_value(operate),
                be.GET_TEXT: lambda: self.get_text(operate),
                be.SEND_KEYS: lambda: self.send_keys(operate),
                be.MOVE_TO_ELEMENT: lambda: self.move_to_element(operate)
            }
  • 在用例中yaml传入自己的关键字即可,看看下面的operate_type中的鼠标悬停
testcase:
    - element_info: cate_item_108698
      find_type: id
      operate_type: move_to_element
      info: 鼠标悬停到.net分类上

后续

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • 之前分享过PageObject+Python+Appium 本版本是对上次版本较大改版,主要解决了: 失败重连一次...
    望月成三人阅读 1,007评论 1 3
  • 来源与:阿里云栖 禁止用于商业用途 ps:如果需要电子书 评论你们邮箱 我会发给你们 下面感觉还是有点乱 目录 一...
    小向资源网阅读 7,523评论 0 12
  • 文/鸿运 一桌佳肴 细品 各有味道
    HONGYUNDANGTOU阅读 188评论 0 1
  • 忽然发现自己的警觉性超级的差,这种差让自己在紧张而又困惑中,伸展着不同的姿势,每一个细节的发生,都会引发各种问题的...
    子之雾阅读 257评论 0 0