python自动化工具说明
python + selenium 实现自动化
1.按照一般步骤实现自动化过程,需要自己手动定位元素,并且代码冗余量很大
2.面向对象思想------封装,对于相同功能的函数进行封装,减少代码的冗余量
3.进一步封装代码,实现最终的自动化框架。把关键字写入excel表格中,然后利用python读取excel表格内容,高度自动化
4.利用RF工具(Java风格,确实RF是Java开发的)基于python2和selenium进行的二次开发,只用找关键字即可
源码:readExcel.py(读取excel表格)
1 #coding=utf-8 2 3 from do_browser import * 4 #安装和导入第三方模块xlrd 5 import xlrd 6 #定义测试用例的文档位置 7 filename = "E:/testcase.xls" #视具体情况而定 8 #打开测试用例的文档 9 excel = xlrd.open_workbook(filename) 10 11 def readExcel(sheetname): 12 #选择要读取的sheet页面的位置 13 sheet = excel.sheet_by_name(sheetname) 14 #读取每一行的内容 15 for each in range(1,sheet.nrows): 16 l = sheet.row_values(each) 17 #将需要的数据保存给自己的变量 18 key,data,method,position = l[0],l[1],l[2],l[3] 19 20 #根据具体的关键字来定义操作的步骤 21 if key == u'打开': 22 #打开浏览器 23 test_open(data) 24 elif key == u'输入': 25 test_input(data, method, position) 26 elif key == u'点击': 27 test_click(method, position) 28 elif key == u'子页面': 29 test_frame(data, method, position) 30 elif key == u's下拉框': 31 test_select(data, method, position) 32 elif key == u'脚本': 33 test_js(data) 34 elif key == u'键盘': 35 test_keys(data) 36 elif key == u'检查': 37 r = test_check(method, position) 38 return r
do_browser.py(浏览器操作)
1 #coding=utf-8 2 #导入所有会用到的模块 3 from selenium import webdriver 4 from selenium.webdriver.common.keys import Keys 5 from selenium.webdriver.common.action_chains import ActionChains 6 from selenium.webdriver.support.select import Select 7 from selenium.webdriver.support.wait import WebDriverWait 8 import time 9 import SendKeys 10 import datetime 11 12 driver = webdriver.Chrome() 13 14 #打开浏览器调用的函数 15 def test_open(url): 16 driver.maximize_window() 17 driver.implicitly_wait(10) 18 driver.get(url) 19 20 #只定位元素位置的函数 21 def get_element_position(method,position): 22 try: 23 if method == 'id': 24 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_id(position)) 25 elif method == 'name': 26 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_name(position)) 27 elif method == 'xpath': 28 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_xpath(position)) 29 elif method == 'class': 30 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_class_name(position)) 31 elif method == 'tag': 32 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_tag_name(position)) 33 elif method == 'link_text': 34 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_link_text(position)) 35 elif method == 'part_text': 36 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_partial_link_text(position)) 37 elif method == 'css': 38 e = WebDriverWait(driver,10).until(lambda x:x.find_element_by_css_selector(position)) 39 except Exception: 40 n = datetime.datetime.now().strftime("%Y%m%d%H%M%S") 41 driver.get_screenshot_as_file("F:/%s.png"%(n)) 42 return None 43 else: 44 return e 45 46 47 #输入值的时候调用的函数 48 def test_input(data,method,position): 49 e = get_element_position(method, position) 50 if e == None: 51 print "输入框没有找到" 52 else: 53 e.clear() 54 e.send_keys(data) 55 56 57 #点击元素的时候调用的函数 58 def test_click(method,position): 59 e = get_element_position(method, position) 60 if e == None: 61 print "要点击的元素没有找到" 62 else: 63 time.sleep(1) 64 e.click() 65 66 #子页面所有操作相关的函数:一共有三种状态:进入、父级、默认 67 def test_frame(data,method,position): 68 if data == u'进入': 69 e = get_element_position(method, position) 70 if e == None: 71 print "没有找到这个子页面" 72 else: 73 driver.switch_to.frame(e) 74 elif data == u'父级': 75 driver.switch_to.parent_frame() 76 elif data == u'默认': 77 driver.switch_to.default_content() 78 79 #操作select下拉框专用的函数 80 def test_select(data,method,position): 81 e = get_element_position(method, position) 82 if e == None: 83 print "没有找到这个下拉框" 84 else: 85 s = Select(e) 86 s.select_by_value(data) 87 88 #用来操作页面上的组件所使用的js脚本函数 89 def test_js(data): 90 driver.execute_script(data) 91 92 #使用键盘发送按键的函数 93 def test_keys(data): 94 time.sleep(2) 95 data = str(data) 96 SendKeys.SendKeys(data) 97 98 #接收一个元素的位置,然后返回这个元素的文本值 99 def test_check(method,position): 100 #先查找元素 101 e = get_element_position(method, position) 102 #如果没有找到元素,就打印提示信息,并且返回一个空值 103 if e == None: 104 print "检查的元素不存在" 105 return None 106 #如果找到了元素,就返回这个元素的文本值 107 else: 108 return e.text
run_case.py(运行)
1 #coding=utf-8 2 3 from readExcel import * 4 import unittest,HTMLTestRunner 5 from sendMail import * 6 7 #新建一个测试类,继承来自单元测试模块的测试用例 8 class test_project(unittest.TestCase): 9 def setUp(self): 10 unittest.TestCase.setUp(self) 11 12 def 模块函数调用 13 14 15 def tearDown(self): 16 unittest.TestCase.tearDown(self) 17 18 if __name__ == "__main__": 19 #定义一个测试套件 20 suite = unittest.TestSuite() 21 suite.addTest(test_project("模块名字")) #可以放多个套件 22 #定义测试报告的文件 23 fp = file("F:/report.html","wb") 24 #生成测试报告 25 runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="aaaaa",description="bbbb") 26 runner.run(suite) 27 fp.close() 28 #测试完成之后,将报告发送出去 29 sendEmail() 30
sendMail.py(发送邮件)
1 #coding=utf-8 2 3 #发送邮件的模块 4 import smtplib 5 #邮件编辑模块 6 from email.mime.text import MIMEText #邮件文字内容 7 from email.mime.multipart import MIMEMultipart #带附件的邮件 8 from email.header import Header #邮件的头部信息 9 10 def sendEmail(): 11 #------------------------------------------------------- 12 #定义收件人和发件人 13 sender = "发件人邮箱" 14 receiver = ['收件人邮箱'] #可以放多个 15 #定义邮件的授权码 16 passwd = "xxxxxxx" 17 #------------------------------------------------------- 18 #编辑邮件内容 19 #定义一个带附件的邮件对象 20 email = MIMEMultipart() #邮件是一个字典类型 21 #添加邮件的头部信息,主题、发件人、收件人 22 email['To'] = Header('xxxxxxx','utf-8') 23 email['From'] = Header('xxxxx,'utf-8') 24 email['Subject'] = Header('xxxxx','utf-8') 25 26 #定义邮件的正文部分:文字内容,文字排版,编码格式 27 t = MIMEText("xxxxxxx","plain","utf-8") 28 email.attach(t) 29 30 #定义邮件的附件内容,并且给附件取个名字 31 t1 = MIMEText(open("F:/report.html","r").read(),"base64","utf-8") 32 t1['Content-Disposition'] = "attachment;filename='测试报告.html'" 33 email.attach(t1) 34 35 36 #将邮件发送出去 37 s = smtplib.SMTP_SSL("smtp.qq.com",465) 38 s.login(sender, passwd) 39 s.sendmail(sender,receiver,email.as_string())
情如风雪无常,却是一动即伤