• python&selenium自动化测试实战项目


    说明:本项目采用流程控制思想,未引用unittest&pytest等单元测试框架

    一.项目介绍

    目的

    测试某官方网站登录功能模块可以正常使用

    用例

    1.输入格式正确的用户名和正确的密码,验证是否登录成功;
    2.输入格式正确的用户名和不正确的密码,验证是否登录失败,并且提示信息正确;
    3.输入格式正确的用户名和任意密码,验证是否登录失败,并且提示信息正确;
    4.用户名和密码两者都为空,验证是否登录失败,并且提示信息正确;
    5.用户名和密码两者之一为空,验证是否登录失败,并且提示信息正确;

    环境

    Windows10 +Python3.6+selenium3.13+Pycharm

    环境我想大多数人都会搭建,有事没事找百度,一搜一箩筐,哈哈!我自己刚学的时候也是各种问题各种百度,好在都解决了,感谢有度娘这么强大的存在!这里就不写环境怎么搭建了,直接进入主题

    二.脚本设计

    目的

    我们的测试脚本需要达到:脚本可移植,脚本模块化,测试数据分离,输出测试报告 等目的

    脚本设计模式

        

    代码实现

    项目目录结构

        

     注:下面的文件存放在同一个目录下

    1. 1 #! user/bin/python
    2. 2 '''
    3. 3 代码说明:麦子学院登录模块自动化测试用例脚本
    4. 4 编写日期:
    5. 5 设置者:linux超
    6. 6 '''
    7. 7
    8. 8 import time
    9. 9 from selenium import webdriver
    10. 10 from webinfo import webinfo
    11. 11 from userinfo import userinfo
    12. 12 from log_fiile import login_log
    13. 13 from pathlib import Path
    14. 14
    15. 15 def open_web():
    16. 16 driver = webdriver.Firefox()
    17. 17 driver.maximize_window()
    18. 18 return driver
    19. 19
    20. 20 def load_url(driver,ele_dict):
    21. 21 driver.get(ele_dict['Turl'])
    22. 22 time.sleep(5)
    23. 23
    24. 24 def find_element(driver,ele_dict):
    25. 25 # find element
    26. 26 driver.find_element_by_class_name(ele_dict['image_id']).click()
    27. 27 if 'text_id' in ele_dict:
    28. 28 driver.find_element_by_link_text('登录').click()
    29. 29
    30. 30 user_id = driver.find_element_by_id(ele_dict['userid'])
    31. 31 pwd_id = driver.find_element_by_id(ele_dict['pwdid'])
    32. 32 login_id = driver.find_element_by_id(ele_dict['loginid'])
    33. 33 return user_id,pwd_id,login_id
    34. 34
    35. 35 def send_val(ele_tuple,arg):
    36. 36 # input userinfo
    37. 37 listkey = ['uname','pwd']
    38. 38 i = 0
    39. 39 for key in listkey:
    40. 40 ele_tuple[i].send_keys('')
    41. 41 ele_tuple[i].clear()
    42. 42 ele_tuple[i].send_keys(arg[key])
    43. 43 i+=1
    44. 44 ele_tuple[2].click()
    45. 45 def check_login(driver,ele_dict,log,userlist):
    46. 46 result = False
    47. 47 time.sleep(3)
    48. 48 try:
    49. 49 err = driver.find_element_by_id(ele_dict['error'])
    50. 50 driver.save_screenshot(err.text+'.png')
    51. 51 log.log_write('账号:%s 密码:%s 提示信息:%s:failed\n' %(userlist['uname'],userlist['pwd'],err.text))
    52. 52 print('username or password error')
    53. 53 except:
    54. 54 print('login success!')
    55. 55 log.log_write('账号:%s 密码:%s :passed\n'%(userlist['uname'],userlist['pwd']))
    56. 56 #login_out(driver,ele_dict)
    57. 57 return True
    58. 58 return result
    59. 59 def login_out(driver,ele_dict):
    60. 60 driver.find_element_by_class_name(ele_dict['logout']).click()
    61. 61 '''
    62. 62 def screen_shot(err):
    63. 63 i = 0
    64. 64 save_path = r'D:\pythondcode\capture'
    65. 65 capturename = '\\'+str(i)+'.png'
    66. 66 wholepath = save_path+capturename
    67. 67 if Path(save_path).is_dir():
    68. 68 pass
    69. 69 else:
    70. 70 Path(save_path).mkdir()
    71. 71 while Path(save_path).exists():
    72. 72 i+=1
    73. 73 capturename = '\\'+str(i)+'.png'
    74. 74 wholepath = save_path + capturename
    75. 75 err.screenshot(wholepath)
    76. 76 '''
    77. 77 def login_test():
    78. 78 log = login_log()
    79. 79 #ele_dict = {'url': 'http://www.maiziedu.com/', 'text_id': '登录', 'user_id': 'id_account_l', 'pwd_id': 'id_password_l'
    80. 80 #, 'login_id': 'login_btn','image_id':'close-windows-btn7','error_id':'login-form-tips'}
    81. 81 ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')
    82. 82 #user_list=[{'uname':account,'pwd':pwd}]
    83. 83 user_list = userinfo(r'D:\pythoncode\userinfo.txt')
    84. 84 driver = open_web()
    85. 85 # load url
    86. 86 load_url(driver,ele_dict)
    87. 87 #find element
    88. 88 ele_tuple = find_element(driver,ele_dict)
    89. 89 # send values
    90. 90 ftitle = time.strftime('%Y-%m-%d', time.gmtime())
    91. 91 log.log_write('\t\t\t%s登录系统测试报告\n' % (ftitle))
    92. 92 for userlist in user_list:
    93. 93 send_val(ele_tuple,userlist)
    94. 94 # check login success or failed
    95. 95 result = check_login(driver,ele_dict,log,userlist)
    96. 96 if result:
    97. 97 login_out(driver,ele_dict)
    98. 98 time.sleep(3)
    99. 99 ele_tuple = find_element(driver,ele_dict)
    100. 100 time.sleep(3)
    101. 101 log.log_close()
    102. 102 driver.quit()
    103. 103
    104. 104 if __name__ == '__main__':
    105. 105 login_test()

    1. 1 #! user/bin/python
    2. 2 '''
    3. 3 代码说明:从文本文档中读取用户信息
    4. 4 编写日期:
    5. 5 设置者:linux超
    6. 6 '''
    7. 7
    8. 8 import codecs
    9. 9
    10. 10 def userinfo(path):
    11. 11 file = codecs.open(path,'r','utf-8')
    12. 12 user_list = []
    13. 13 for line in file:
    14. 14 user_dict = {}
    15. 15 result = [ele.strip() for ele in line.split(';')]
    16. 16 for sult in result:
    17. 17 re_sult = [ele.strip() for ele in sult.split('=')]
    18. 18 user_dict.update(dict([re_sult]))
    19. 19 user_list.append(user_dict)
    20. 20 return user_list
    21. 21
    22. 22 if __name__ == '__main__':
    23. 23 user_list = userinfo(r'D:\pythoncode\userinfo.txt')
    24. 24 print(user_list)

    1. 1 #! user/bin/python
    2. 2 '''
    3. 3 代码说明:从文本文档中读取web元素
    4. 4 编写日期:
    5. 5 设置者:linux超
    6. 6 '''
    7. 7
    8. 8 import codecs
    9. 9
    10. 10 def webinfo(path):
    11. 11 file = codecs.open(path,'r','gbk')
    12. 12 ele_dict = {}
    13. 13 for line in file:
    14. 14 result = [ele.strip() for ele in line.split('=')]
    15. 15 ele_dict.update(dict([result]))
    16. 16 return ele_dict
    17. 17
    18. 18 if __name__ == '__main__':
    19. 19 ele_dict = webinfo(r'D:\pythoncode\webinfo.txt')
    20. 20 for key in ele_dict:
    21. 21 print(key,ele_dict[key])

    1. 1 #! user/bin/python
    2. 2 '''
    3. 3 代码说明:测试输出报告
    4. 4 编写日期:
    5. 5 设置者:linux超
    6. 6 '''
    7. 7
    8. 8 import time
    9. 9
    10. 10 class login_log(object):
    11. 11 def __init__(self,path='',mode='w'):
    12. 12 filename = path + time.strftime('%Y-%m-%d',time.gmtime())
    13. 13 self.log = open(path+filename+'.txt',mode)
    14. 14 def log_write(self,msg):
    15. 15 self.log.write(msg)
    16. 16 def log_close(self):
    17. 17 self.log.close()
    18. 18 if __name__ == '__main__':
    19. 19 log=login_log()
    20. 20 ftitle = time.strftime('%Y-%m-%d',time.gmtime())
    21. 21 log.log_write('xiaochao11520')
    22. 22 log.log_close()

    1. 1 uname=273839363@qq.com;pwd=xiaochao11520
    2. 2 uname=273839363;pwd=xiaochao11520
    3. 3 uname= ;pwd=xiaochao11520
    4. 4 uname=273839363@qq.com;pwd=
    5. 5 uname=2738;pwd=xiaochao

    1. 1 Turl=http://www.maiziedu.com/
    2. 2 text_id=登录
    3. 3 userid=id_account_l
    4. 4 pwdid=id_password_l
    5. 5 loginid=login_btn
    6. 6 error=login-form-tips
    7. 7 logout=sign_out
    8. 8 image_id=close-windows-btn7

    实在是不擅长写文章,写完感觉内容好少,其实这么一个小模块涉及到的知识还是挺多的,但是不知道该如何下手整理,想看的就对付看下把,实在抱歉!

    Python接口自动化测试零基础入门到精通(2023最新版)

  • 相关阅读:
    【Linux网络】FTP服务
    关系数据库的原子性
    【ES笔记01】ElasticSearch数据库之index索引、doc文档、alias别名、mappings映射结构的基本操作
    gorm-增删改查
    java毕业设计校园新闻网站mybatis+源码+调试部署+系统+数据库+lw
    30张图说清楚 TCP 协议
    MyBatis——xml的优化及动态代理的实现
    C/C++好用的websocket库
    自制操作系统日志——第二十八天(实现中文字符显示)
    超精准!AI 结合邮件内容与附件的意图理解与分类!⛵
  • 原文地址:https://blog.csdn.net/wqda125/article/details/133999548