今天主要学习了下hudson的配置,和ant相结合的操作。
其实很简单,hudson就是一个持续集成的东西,我现在的理解就是自动帮你跑脚本,定时执行,当有代码更新的时候就是自动更新下。
主要步骤就是新建一个job,然后进行配置。
因为要从SVN里取代码,所以需要填写SVN地址:

然后填写svn用户密码
接着在shell窗口里:
输入shell
#!/bin/bash
export JAVA_HOME="/home/debian/soft_wares/jdk1.6.0_25"
export PATH="$PATH:/home/debian/soft_wares/jdk1.6.0_25/bin"
export CLASSPATH="$CLASSPATH:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/*"
echo $CLASSPATH
ant alltests
主要是JAVA_相关的变量
最后用ant tartget即可
最后保存后,构建JOB即可
注意:今天遇到问题,要选择job运行的机器,因为如果不选择,是随机选一个,可能导致环境变量设置不正确:

这里选择跑哪个机器。
今天学习了一下selenium怎么对付弹出窗口,像webdriver话就是直接可以用selectallwindowsID-selectcurrentID就可得到弹出的窗口,在selenium里面的话,可以用selectWindowID来做。
具体用到了两个方法:
sel.getAllWindowTitles()
sel.selectWindow()
其实就是通过getallWindowsTitles得到这次操作所有打开窗口的title,返回一个list吧,然后list[0]是原来的,list[1]就是新弹出的了
通过sel.selectWindow(sel.getAllWindowTitles()[1])就可以得到了新弹出的窗口,最后操作就可以了。
另外就是小小的学习了下java的list和MAP
初始化一个list,那就是ArrayList<string> a=new ArrayList<>()
这里的话不要初始化ArrayList<string> a=NULL
还是会报空指针的错误。
map初始化就是 Map<Integer, String>Newsmap=new HashMap<>();这里不能用int.因为int只是Integer的一种,另外右边也不可以是new MAP
,其他操作方法都一样。
import re
第一部分:
出现个数:
1.‘*’前面的匹配串出现0-无穷次
2.‘+’出现1-无穷次
3.‘?’出现0次到1次
4.{m,n}出现m次到n次
5.{m,n}?m到n里面出现的最低次数
比如re.serach('a{2,4}?','aaaa')则是aa
6.'$'表示结尾,以前面的匹配串结尾,注意一般用serach
7.‘^’表示开头
第二部分:
出现类型:
1.‘\w’表示任何字母和数字,\W非数字
2.'\d'只表示数字,\D表示非数字
3.'.'表示任何字符,不包括换行符号
4.'()'表示一个元组,相当与括号里看作一个整体
第三部分:
几个重要的方法:
1.match():从头开始匹配
2.search():任何地方
3.findall()返回一个元组,只针对()的
4.group()返回匹配的结果
5.sub(x,y,string):x要代表被替换的字符,y代表代替x的字符,string只有地方需要替换的字符串
6.subn(),返回替换的个数
7.start(),end(),代表出去匹配字符串之后,字符串剩下部分的头和尾巴
>>> email = "tony@tiremove_thisger.net"
>>> m = re.search("remove_this", email)
>>> email[:m.start()] + email[m.end():]
'tony@tiger.net'
1.bin():返回一个二进制
bin(x)
2.enumerate(list)
返回一个枚举类型,比如
for i,value in enumerate([‘ok’,’ko’])
print i ,value
则输出0,ko
1,ko
3.
1.str.title()//把字符串变成标题
>>> "they're bill's friends from the UK".title()
"They'Re Bill'S Friends From The Uk"
2.str.translate(None,XX)//删除掉选定的字符串里的字母
>>> 'read this short text'.translate(None, 'aeiou')//即把aeiou变成了元组
'rd ths shrt txt'
3..format,//这里是输出字典时候可以
>>> print '%(language)s has %(number)03d quote types.' % \
... {"language": "Python", "number": 2}
Python has 002 quote types.
4.sorted
>>> sorted(p.items().key=lambda p:p[1],reverse=True)
对字典p按照vlues来进行排序,返回一个键值和values的list
5.f.readline()和f.readlines()
>>> readline()//读一行,返回一行的字符串,readlines()读整个文件,返回每行,当作一个列表
6.zip(list a,list b)//很好的函数
>>>a=['1','2'],b=['3','4']//如何把更快的把a,b合并成为一个字典呢
用zip
c={}
for x,y in zip(a,b)://就可以一一对应了
c[x]=y
7.odd()//用于判断一个数字是奇数还是偶数,奇数返回1,偶数返回0,能简单就简单吧
8.如何快速找出一个文件的最大行数呢?
很简单:
max(len(x.strip()) for x in open(filename))
9.round(x,n)//四舍五入到小数点后几位
round(3.6,1)=3.6 round(3.6)=4
10.str.decode('utf-8').把其他编码格式的字符串转为unicode
str.encode('utf-8')把unicode格式的字符串编码成utf-8形式。
Decode和encode中间是以unicode为媒介的,所以转码前弄清出str编码
11.# -*- coding: utf-8 -*- 最好在每个py文件前加上这个,先默认编码格式为utf-8方便转
12.str.find(x,from,to)
在字符串里找出字符X,from和to表示从起始末尾位置,如果找不到,则返回-1,记住,-1不是元素位置
13.
1.取当前脚本所在路径
os.path.realpath(__file__).lstrip(sys.argv[0])
再总计下python-logging模块
#-*-coding:utf-8-*-
import logging
import logging.handlers
import time
try:
logger1 = logging.getLogger()#实例
logger2 = logging.getLogger()
logger1.setLevel(logging.DEBUG)#定义BUG级别
format = logging.Formatter('%(asctime)s-%(name)s-%(message)s',datefmt=time.strftime('%Y%m%d'))#格式
fh=logging.FileHandler('D:\\doc\\hello.log')#文件句柄
fh.setLevel(logging.DEBUG)
fh.setFormatter(format)
logger1.addHandler(fh)#添加文件句柄
logger1.debug('hello')
ch=logging.FileHandler('D:\\doc\\he.log')
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger2.addHandler(ch)
logger2.info('hello11')
except Exception ,e:
print e
另外一个python操作excel:
简单的说,就是
读取一张表格->读取具体的一张表单->读取行列数据
#-*-coding:UTF-8-*-
import xlrd
from urllib2 import urlopen
excel=xlrd.open_workbook('d:\\doc\\quanshang.xls')//读取一个excel
sheet=excel.sheet_by_index(0)//读取某一张表单
url_columu=sheet.col_values(3)//读取某一列,返回一个list
md5_columu=sheet.col_values(4)
i=j=0
for num in range(1,len(url_columu)):
text=urlopen(url_columu[num].encode("utf-8")).read()
if text.find(md5_columu[num].encode("utf-8"))!= -1:
print 'find'
i=i+1
else:
print 'sorry',num+1
j=j+1
print i
获取每一行的信息
#打印每行的信息
for rownum in range(sheet.nrows):
#每一行的信息
print sheet.row_values(rownum) #列表
最后根据索引来确定:
cell_A1 = sheet.cell(0,0).value
X是row,Y是col
按照接受双方对象分为服务端和客户端。
服务端主要用到了几个步骤:
1.初始化一个套接字:
socket()://两个参数,一个AF_INET:socketfamily,另外一个是SOCK_STREAM表示用tcp连接
2.bind(addr),绑定一个地址,这里的addr是一个map,有HOST和PORT两个参数
3.listen()://监听请求,参数表示最多能监听几个请求
4.accept://接受套接字,返回客户端的一个套接字对象和地址,然后通过这个返回对象进行操作,包括对消息的反馈等等
5.close():关闭套接字资源,包括关闭接受的客户端套接字对象和服务端套接字对象
def serv(HOST='',PORT=25111):
6 Addr=(HOST,PORT)
7 tcpser=socket(AF_INET,SOCK_STREAM)
8 try:
9 tcpser.bind(Addr)
10 tcpser.listen(5)
11 except Exception,e:
12 print 'sorry,faild',e
13 while True:
14 print 'waiting for connection...'
15 tcpcli,addr=tcpser.accept()
16 print 'connection from ... ',addr
17 while True:
18 data=tcpcli.recv(BUFSIZ)
19 if not data:
20 break
21 tcpcli.send(('[%s],%s')%(ctime(),data))
22 tcpcli.close()
客户端:
1.同样初始化一个套接字:
2.建立和服务端的连接:可以有connect()和create_connection()两个函数,有两个参数:第一个地址addr,另外一个就是timeout
3.send(data)发送一个套接字数据
4.recv()接受一个套接字数据。参数可以是接受数据量大小
5.close()
import socket
HOST='localhost'
PORT=21568
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpclisock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpclisock.connect(ADDR)
while True:
data=raw_input('>')
if not data:
break
tcpclisock.send(data)
data=tcpclisock.recv(BUFSIZ)
if not data:
break
print data
tcpclisock.close()
PS:
暂时就学了这么一点,另外几个点:服务端的套接字没有recv(data),所以想接受和发送数据就通过accept()返回的套接字对象来进行操作即可

