在写某个平台的自动化脚本时,笔者把全部的操作都封装到了两个类中,page.py和commonpage.py:

page.py部分代码:
class BasePage(object):
'''
页面基础类
'''
def __init__(self, driver):
self.driver = driver def find_element(self,loc):
return self.driver.find_element(*loc) #在输入框中输入文字
def input_text(self,loc,text):
self.find_element(loc).send_keys(text)

commonpage.py部分代码:
class CommonPage(BasePage):
'''平台通用的功能'''
####################################
#点击菜单
#big:第几个大菜单
#small:第几个小菜单
def click_menu(self,big):
big_menu = (By.XPATH,"//ul/li[%s]/a/span"%big)
self.click(big_menu)
sleep(2) def click_small_menu(self,small,list):
small_menu = (By.XPATH,"//ul/li[%s]/ul/li[2]"%small)
self.click(small_menu)
sleep(2)

页面的操作只要调用这两个类(大部分其实在调用commonpage类),几乎能完成全部元素的封装、简化操作流程等。类似封装页面元素部分代码:

from pages.page import BasePage
from pages import commonpage,loginpage #活动编辑-报名表界面
class act_applyPage(BasePage): #点击菜单
def goto_activity_page(self):
loginpage.LoginPage(self.driver).login_sys(username="abcd", passwd="password")
com_page = commonpage.CommonPage(self.driver)
com_page.click_menu(2,1) #点击某个tab
def click_act_apply_tab(self):
print u"点击 act_apply_tab"
compage = commonpage.CommonPage(self.driver)
compage.click_tab(5)

能看出封装页面元素的代码很多都是类似的,只是参数不同。这就引发了笔者的思考:“能不能快捷生成代码?”

上网搜索资料,大多都是使用Templat类,研究后发现达不到笔者想要结果(也有可能笔者还没掌握Templat类的使用,T-T)。

最近刚好总结了python处理配置文件的知识,想到可以用在自动生成代码这里。

大致思路是:section值可作为类名,option值可作为方法,在value中,用“,”隔开多个有用的参数,其中第一个参数是option的类型(这个类型决定用那一段代码);

先遍历sections,在每个section下,遍历{option:value}键,分析value中的类型,把对应的代码写到文件中。

先来看看配置文件:

#活动
#section
[activity,frmActivityEdit]
#{option:value}
start_part:start,活动编辑,
activity:menu,2,1
add_button:addbtn,4,

下面是生成脚本的部分代码:

import ConfigParser
import time conf = ConfigParser.RawConfigParser()
#读取配置文件
conf.read("section1.cfg")
now = time.strftime("%Y-%m-%d",time.localtime(time.time()))
sectionlist = conf.sections()
#print sectionlist
for list in sectionlist:
(classname,frmedit) = list.split(',')
#生成文件
pyfilepath = r'E:\\workspace\\%spage.py'%classname
#写文件
pyfile = open(pyfilepath,'w')
#读取每个section,遍历键,分析类型,写入代码
optionlist = conf.options(list)
for list2 in optionlist:
#分解value
(optiontype,ranking,selector) = conf.get(list, list2).split(',')
#需要生成的脚本
menu_code = '''\n\n def goto_%s_page(self):
loginpage.LoginPage(self.driver).login_sys(username="abcd", passwd="password")
com_page = commonpage.CommonPage(self.driver)
com_page.click_menu(%s,%s)'''%(list2,ranking,selector)
#判断类型,决定写入哪些脚本
if optiontype == 'start':
pyfile.writelines(start_code)
elif optiontype == 'menu':
pyfile.writelines(menu_code)
else:...
pyfile.close()

接下来只要完善配置文件,大部分的界面类就能完成了。

持续学习中,,,

(Python)自动生成代码(方法一)的更多相关文章

  1. Python自动生成代码工具

    项目中有一个需求,对一个基类而言,拥有一个比较方法和拷贝方法,某些地方需要频繁地对这两个方法进行调用.对于所有子类而言,需要重写这两个方法,并在其中维护类内一些成员变量.例如有一个变量m_iMyVal ...

  2. python 自动生成C++代码 (代码生成器)

    python 代码自动生成的方法 (代码生成器) 遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错:而借用pyth ...

  3. mybatis-generator自动生成代码时,只生成insert方法

    今天使用mybatis-generator自动生成代码时,发现只能生成insert方法, 以前所有的方法都是可以生成的,查看网上解决办法和检查数据库表结构后, 发现2种可以解决的办法: 1.修改myb ...

  4. 从用python自动生成.h的头文件集合和类声明集合到用python读写文件

    最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...

  5. mybatis 自动生成代码(mybatis generator)

    pom.xml 文件配置 引入 mybatis generator <properties> <mysql.connector.version>5.1.44</mysql ...

  6. ButterKnife的使用以及不能自动生成代码问题的解决

    ButterKnife的使用以及不能自动生成代码问题的解决 转载请注明出处:http://www.cnblogs.com/zhengjunfei/p/5910497.html 最近换了个工作刚入职,又 ...

  7. 【MyBatis】MyBatis自动生成代码查询之爬坑记

    前言 项目使用SSM框架搭建Web后台服务,前台后使用restful api,后台使用MyBatisGenerator自动生成代码,在前台使用关键字进行查询时,遇到了一些很宝贵的坑,现记录如下.为展示 ...

  8. mybatis-generator自动生成代码插件

    mybatis自动生成代码(实体类.Dao接口等)是很成熟的了,就是使用mybatis-generator插件. 它是一个开源的插件,使用maven构建最好,可以很方便的执行 插件官方简介: http ...

  9. SpringBoot 添加mybatis generator 自动生成代码插件

    自动生成数据层代码,提高开发效率 1.pom添加插件,并指定配置文件路径 <!-- mybatis generator 自动生成代码插件 --> <plugin> <gr ...

随机推荐

  1. 【English】十五、“a”和“one”的区别是什么?

    一."a"和"one"的区别是什么 参考:“a”和“one”的区别是什么-百度知道 a和one的区别是什么?-作业帮 1.尽管a和one这两个在意义上有些相似, ...

  2. 【Objective-C学习笔记】变量和基本的数据类型

    OC是增强了C的特性,所以在变量和基本数据类型上基本与C一致. 在OC中变量命名有如下规则: 由字母.数字.下划线.$符号组成 必须以字母.下划线.$符号开头 大小写敏感 在OC中定义变量的时候不能使 ...

  3. Java关于日期的计算持续汇总~

    /** * 00 * 描述:传入Date date.转为 String yyyyMMdd. * [时间 2019-04-18 15:41:12 作者 陶攀峰] */ public static Str ...

  4. C#枚举(Enum)小结

    枚举概念 枚举类型(也称为枚举)提供了一种有效的方式来定义可能分配给变量的一组已命名整数常量.该类型使用enum关键字声明. 示例代码1 enum Day { Sunday, Monday, Tues ...

  5. Docker-Docker-compose应用

    Docker-compose是用来定义和运行多容器应用的工具,它是独立于docker存在的,需要单独安装.实际应用场景中,我们的应用可能被打包运行在不同的容器里面,例如一个常规的web应用可能会涉及到 ...

  6. Surging微服务的注意事项

    做个记录 1.Service的方法必须是异步方法 这个是同事发现的,非异步方法Swagger会用不了 2.仓储层不能用接口 这个是自己做的,根据同事的例子,本来好好的,想着在仓储层给加个接口,然后用接 ...

  7. python学习笔记4_类和更抽象

    python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...

  8. 江苏省选2019Round2游记

    JSOI2019R2过去了. 翻盘变翻车... Day 0 打板子.写了几棵主席树. 然后啃CF 331D3.啃不动 Day 1 开T1.这什么玩意啊...换换换 开T2.一眼\(10\)分的状压,码 ...

  9. Python学习案例之视频人脸检测识别

    前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中 ...

  10. Scrum Meeting 博客

    笨拙软件工程 Scrum Meeting 博客汇总 一.Alpha阶段 [alpha阶段]第一次Scrum Meeting [alpha阶段]第二次Scrum Meeting [alpha阶段]第三次 ...