zoukankan      html  css  js  c++  java
  • selenium+python(数据驱动测试)

    自动化领域的两种驱动,对象驱动与数据驱动

    • 数据驱动:测试数据的改变引起执行结果的改变 叫 数据驱动
    • 关键字驱动:测试对象名字的改变起引起测试结果的改变 叫 关键字驱动

    1 、读取文件参数化
       以百度表搜索为例,我们可以通过脚本循环执行,读取一文件中不同的内容来完成自动
    化工作,也就是说我们每次取的文件里的搜索关键字不同,而每次百度搜索的的结果不同,
    这也是数据驱动的本质。

    代码如下:
    d:abcdata.txt
    baidu_read_data.py

    #coding=utf-8
    from selenium import webdriver
    import os,time
    source = open("D:\abc\data.txt", "r")
    values = source.readlines()
    source.close()
    # 执行循环
    for serch in values:
    browser = webdriver.Firefox()
    browser.get("http://www.baidu.com")
    browser.find_element_by_id("kw").send_keys(serch)
    browser.find_element_by_id("su").click()
    browser.quit()
    

    这里简单说明一下,open 方法左以只读方式(r)打开本地的 data.txt 文件,readlines方法是逐行的读取文件内容。

    通过 for 循环,serch 可以每次获取到文件中的一行数据,在定位到百度的输入框后,
    将数据传入 send_keys(serch)。这样通过循环调用,直到文件的中的所有内容全被读取。
    2 、用户名密码的参数化(读取文件)

    后面的例子一登录百度为例,主要是读取文件(因为百度的登录时,需要验证码,所以也没不会登录成功)

    按照上面的方法,对自动化脚本中用户名密码进行参数化,从目前所查到 python 读取方法有,整个文件读取,逐行读取,固定字节读取。

    怎样才一次读取用户名和密码两个信息呢,最初的修改是这样的:
    创建两个文件,分别存放用户名密码
    调用用户名密码登录登录的脚本

    #coding=utf-8
    from selenium import webdriver
    import os,time
    source = open("D:\abc\data2.txt", "r") #用户名文件
    user = source.read(5) #用户名长度
    source.close()
    source2 = open("D:\abc\data3.txt", "r") #密码文件
    pw = source2.read(6) #密码长度
    source2.close()
    driver = webdriver.Firefox()
    driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
    driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
    driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
    time.sleep(3)
    driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
    driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
    time.sleep(3)
    driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
    time.sleep(3)
    driver.close()

    缺点:

    虽然目的达到了这,但这样的实现有很多问题:

    • 用户名密码分别在不同的文件里,这样就要求用户名密码必须一一对应
    • 必须指定读取的长度,测试 readlines() 并不是读取的一行数据。
    • 无法循环读取。

    3 、用户名的参数化(字典)
      用户名密码参数化
     解决循环调用
    如果固定只是读取用户名,密码两个值,可以通过如下方法实现。
    创建 fun.py 文件,定义一个字典方法(方法文件和case文件放在一个根目录下):

    def zidian():
    d={'fnngj':'a23456','testing360':123456}
    print "suess read username and password!!"
    return d
    

    字典的可以方便的存放 k,v 键值对,一个键对应一个值;注意,如果密码中有非数字,需要加单引号。

    下面循环调用词典的值:

    #coding=utf-8
    from selenium import webdriver
    import os,time
    import fun #导入函数
    #循环调用字典里的用户名密码,分别赋值给 k,v
    for k,v in fun.zidian().items():
    driver = webdriver.Firefox()
    driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
    driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
    driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
    time.sleep(3)
    driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
    driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
    time.sleep(3)
    driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
    time.sleep(3)
    driver.close()

    脚本这样表设计就稳定了很多,每次取的值非常固定,而且同样实现了参数与脚本分离,如果几百个脚本都调用 fun( ) 函数,当需要修改用户名密码时,只用修改 fun( )函数里面字

    典的值就可以了。
    4 、用户名密码的参数化(函数)
    其实,在项目中只需要做到参数化就行了,并不需要循环的读取内容。那么通过函数调用就可以很简单的解决。
    首先定义fun.py,(方法文件和case文件放在一个根目录下)

    def user(k='fnngj',v=123456):
      print "suess read username and password!!"
      return k,v
    

    赋默认值,并将结果返回。

    调用函数值:

    #coding=utf-8
    from selenium import webdriver
    import os,time
    #导入函数
    import fun 
    #通过调用函数获得用户名&密码
    k,v = fun.user()
    print k,v
    driver = webdriver.Firefox()
    driver.get("https://passport.baidu.com/v2/?login&tpl=mn&u=https%3A%2F%2Fwww.baidu.com%2F")
    driver.find_element_by_id("TANGRAM__PSP_3__userName").clear()
    driver.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(k)
    driver.find_element_by_id("TANGRAM__PSP_3__password").clear()
    driver.find_element_by_id("TANGRAM__PSP_3__password").send_keys(v)
    driver.find_element_by_id("TANGRAM__PSP_3__submit").click()
    time.sleep(3)
    driver.close()

     运行结果:

    >>> =================== RESTART ================================
    >>>
    suess read username and password!!
    fnngj 123456
    .
    ----------------------------------------------------------------------
    Ran 1 test in 25.484s
    OK

  • 相关阅读:
    【编程思想】【设计模式】【结构模式Structural】适配器模式adapter
    【编程思想】【设计模式】【结构模式Structural】3-tier
    【编程思想】【设计模式】【创建模式creational】原形模式Prototype
    【编程思想】【设计模式】【创建模式creational】Pool
    【编程思想】【设计模式】【创建模式creational】lazy_evaluation
    【编程思想】【设计模式】【创建模式creational】Borg/Monostate
    【编程思想】【设计模式】【创建模式creational】抽象工厂模式abstract_factory
    【编程思想】【设计模式】【创建模式creational】建造者模式builder
    【编程思想】【设计模式】【行为模式Behavioral】策略模式strategy
    【编程思想】【设计模式】【创建模式creational 】工厂模式factory_method
  • 原文地址:https://www.cnblogs.com/101718qiong/p/7418516.html
Copyright © 2011-2022 走看看