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
View Code

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
View Code

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     
View Code

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())
View Code

 

posted @ 2018-12-01 09:41  一叶知秋WDZY  阅读(215)  评论(0)    收藏  举报