python使用总结

近来公司的测试部门要我们开发,按他们给我测试案例,写vba脚本,方便他们做自动化测试,老大把这事交给了我做。之前没写过vba,很多API都不会用,边写边谷歌,写得很慢。


我记得测试第一次做的是打开关闭文档的案例,总共15个案例,我之前纯在vba环境里写,大概用了我四个多小时,整个的案例的过程都是:

sub case__xx()
......
end sub

每个案例的代码都不多,大概是十行左右,外边案例流程的注释, 总共也就150行代码,共花四个小时。周末加个班,也就写完了。交差!


过不了几天,测试又拿了个另一个功能的测试案例过来,要我写vba脚本,我看了一下表格,愣了,200个案例?!而且明天就要,给他们。虽然我的数学是语文老师教的,但大概的数我还是会算的,按每个案例5行代码,最小值估计,我也要写1000多行代码,还要明天交?给一天8个小时算,按我上次的进度,是交不了差的。


每一个案例老老实实写是行不能滴,我扫了一下那些案例,发现它们有一个共同点,做的事情很有规律。只此我想到了做一个vba脚本生成器来做这些事情。只为大学时写过半个月python代码,所以我选它来做这个vba脚本生成器,搞了两个半小时,最终真的把那200个案例的代码生成了,而且每个案例的开头和之前的一致,注释、缩进都有,唯一缺点是生成的代码冗余很多。以下是我写到的python的对象及相应模块。


一、文件操作类
(1)python打开一个文件的操作很简单

file = open(“路径”)

相比C++,的引用头文件,指针判空,效率不知提高了几倍。


(2)文件读取操作

line = file.readline() #读取文件里的一行
lines = file.readlines() #读取全部内容

(3)写操作

file.write(string)

(4)关闭文件

file.close()

 

二、字符串类
(1)切片操作
这个很好用,很多脚本都有这个功能

substr = str[1:4] #取字符串第1到3的子串,下标从0开始

(2)format操作
我之前的字符串拼接总是用

“hello %s\n” %(str)

总觉得不好用,不能把字符串放到一个地方统一管理,最后发现有个format方法

strprint = "hello {0}\n"
strprint.format(str)

这个比第一个好用太多了,用多了就知道了
(3)split方法
将字符串按给定的分成一个list,如:

str = "hello world"
list = str.split(" ")   # list = ["hello", "world"],是不是很方便

 

三、内置数据结构
pytthon内置有dict,list,tupple,我用得比较多的是list和dict。
list可以理解为一个数组,不过它的功能比数组强大,可以到网上找下介绍
dict是一个键值对的结构,很常用,也很好用。

    dict = {
    "插入" : insertAction,
    "输入" : inputAction,
    "删除" : deleteAction
    }


四、sys模块
Sys模块里面有个argv的成员,是一个数组,可以取到命令行的输入参数,像C语言main函数里的argv。


五、os模块
可以取到当前的系统路径,可以用它里面的成员来进行系统文件操作,很方便


大概就用到了这些,里面基本用到的是函数,没有用到类。下面会附些代码片段。

  1 #!usr/bin/python
  2 #FileName: vba_generator.py
  3 
  4 #辅助方法
  5 def write_to_file(file_out, list):
  6     for str in list:
  7         file_out.write(str)
  8         
  9 def delete_useless_chart(str):
 10     str = str.strip()
 11     if str == "":
 12         return ""
 13     print ("\tfunc delete_useless_chart: %s \n"%(str))
 14     if (str.find("") != -1):
 15         list = str.split("")
 16         return list[1]
 17     else:
 18         return str
 19         
 20 def init(file_out):
 21     print ("\tinit\n")
 22     list = ["""\tindex_slide =  ActivePresentation.Slides.Count
 23     If index_slide < 1 then Exit Sub\n""",
 24     "\tset shapes = ActiveWindow.Selection.SlideRange.Shapes\n"]
 25     write_to_file(file_out, list)
 26     
 27 def end_case(file_out):
 28     write_to_file(file_out, "End Sub\n")    
 29 
 30 def begin_case(func_name, file_out):
 31     list = ["Sub %s()\n"%(func_name), 
 32             "\twindowsIndex = 1\n",
 33             "\tApplication.Windows(windowsIndex).Activate\n",
 34             "\tDim shapes as shapes\n",
 35             "\tDim index_slide as Integer\n"]
 36     write_to_file(file_out, list)
 37     
 38 def open_action(line, file_out):
 39     print ("\topen_action: %s\n"%(line))
 40     write_to_file(file_out, "\t\'操作: %s\n"%(line))
 41 
 42 def close_action(line, file_out):
 43     write_to_file(file_out, "\t\'操作: %s\n"%(line))
 44     write_to_file(file_out, "\tPresentations.Item(windowsIndex).Saved = ksoTrue\n\
 45 \tActivePresentation.Close\n")
 46 
 47 def change_action(line, file_out):
 48     dict = { "母版视图" : """\tActiveWindow.ViewType = ppViewSlideMaster
 49     index_slide = ActivePresentation.Designs.Count
 50     If index_slide < 1 then Exit Sub
 51     set shapes = ActivePresentation.Designs(1).SlideMaster.Shapes\n"""
 52     }
 53     
 54     temp_str = line.split("")[1]
 55     str = dict.get(temp_str, "Todo")
 56     if (str != "Todo"):
 57         write_to_file(file_out, "\t\'操作:%s\n"%(line))
 58         write_to_file(file_out, str)
 59     else:
 60         write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line))
 61     
 62 def insert_action(line, file_out):
 63     dict = { "矩形" : """\tshapes.AddShape(msoShapeRectangle, 133.25, 94.25, 232.38, 130.38).Select\n""",
 64             "线条" : """\tshapes.AddLine(70.88, 338, 428, 394.75).Select\n""",
 65             "表格" : """\tshapes.AddTable(3, 3).Select\n""",
 66             "图表" : """\tshapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, ClassName:="Et.chart.6", Link:=msoFalse).Select
 67     With ActiveWindow.Selection.ShapeRange
 68         .Left = 120
 69         .Top = 109.875
 70         .Width = 480
 71         .Height = 320.25
 72     End With\n""",
 73             "艺术字" : """\tshapes.AddTextEffect msoTextEffect15, \"WPS Office\", \"Arial\", 30, ksoFalse, ksoFalse, 0, 0\n""",
 74             "公式" : """\tActiveWindow.Selection.SlideRange.Shapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, ClassName:=\"Equation.KSEE3\", Link:=msoFalse).Select
 75             \t\'上面只能调出公式编辑窗口,以下流程应该用测试工具保障\n""",
 76             "符号" : """\tTodo\n"""}
 77     str = dict.get(line[2:], "Todo")
 78     if (str != "Todo"):
 79         write_to_file(file_out, "\t\'操作:%s\n"%(line))
 80         write_to_file(file_out, str)
 81     else:
 82         write_to_file(file_out, "\t\'备注: %s vba实现不了\n"%(line))
 83 
 84 def delete_action(line, file_out):
 85     #print (line[2:])
 86     if (line[2:] == "输入内容"):
 87         write_to_file(file_out, "\t\'操作:%s\n"%(line))
 88         write_to_file(file_out, "\tshapes.Item(1).TextFrame.TextRange.Text = \"\"\n")
 89     elif (line[2:] != "组织结构图"):
 90         write_to_file(file_out, "\t\'操作:%s\n"%(line))
 91         write_to_file(file_out, "\tcount = shapes.count\n\
 92 \tif count > 0 Then shapes(count).Delete\n")
 93     else:
 94         write_to_file(file_out,  "\t\'备注: %s vba实现不了\n"%(line))
 95         
 96 def input_action(line, file_out):
 97     if (line[2:5] == "占位符" or line[2:4] == "内容"):
 98         list = line.split("")
 99         str_value = list[1][0:-1]
100         print (str_value)
101         write_to_file(file_out, "\t\'操作:%s\n"%(line))
102         write_to_file(file_out, "\tshapes.Item(1).TextFrame.TextRange.Text = \"%s\"\n"%(str_value))
103     
104 def main():
105     import sys
106     file_name = sys.argv[0]
107     file_dir = file_name.split("vba_generator.py")[0]
108     
109     file_in = open(file_dir + "\delete.txt")
110     file_out = open(file_dir + "\delete_case_vba.txt", 'w')
111     
112     case_index = 0
113     first_step = 1
114     for str in file_in.readlines():
115         str = delete_useless_chart(str)
116         print (str)
117         if (str.strip() == ""):
118             continue
119         if (str[0:4] == "Case"):
120             if (case_index != 0):
121                 end_case(file_out)
122             first_step = 1
123             case_index += 1
124             begin_case(str[0:4] + "_%d"%(case_index), file_out)
125         else:
126             if (first_step == 1 and str[0:2] != "切换"):
127                 init(file_out)
128                 first_step = 0
129             print (str)
130             if (str[0:4] == "打开文档"):
131                 open_action(str, file_out)
132             elif (str[0:4] == "关闭文档"):
133                 close_action(str, file_out)
134             elif (str[0:2] == "切换"):
135                 change_action(str, file_out)
136             elif (str[0:2] == "插入"):
137                 insert_action(str, file_out)
138             elif (str[0:2] == "删除"):
139                 delete_action(str, file_out)
140             elif (str[0:2] == "输入"):
141                 input_action(str, file_out)
142             else:
143                 print ("\tmain function: to %s\n"%(str))
144         
145     end_case(file_out)
146     case_index += 1
147     file_in.close()
148     file_out.write("Sub main()\n")
149     for i in range(1, case_index):
150         file_out.write("\tCase_%d\n"%(i))
151     end_case(file_out)
152         
153     file_out.close()
154 if (__name__ == "__main__"):
155     main()
156                 
View Code

 

posted @ 2013-11-03 01:09  Be a programer  阅读(382)  评论(0)    收藏  举报