1.查询API的方法
命令行输入
python -m pydoc -p 8090
浏览器输入127.0.0.1:8090就能查看已安装的package的API
2.Frame内的元素查找需要先切换到相关frame内才能查找到
switch_to_frame('frame_name'),返回默认视图为switch_to_default_content()
3.查找元素的方法多样,尽量选择比较固定的方式,后期如果页面有改动不会影响元素的定位
xpath是xml语言查找信息的语言.
例如取百度搜索的第一条记录的title的xpath,采用绝对定位方式为
/html/body/div[3]/div[4]/div/div[3]/div[1]/h3/a
采用相对方式定位
//div[@id='1']/h3/a
或者是
//div[@id='content_left']/div[1]/h3/a
显然采用绝对的方式定位时,如果页面有一点改动,例如增加div嵌套后定位就失效了.
此外还有其它的定位方式:
id,name,class name,link text,tag name,xpath,css selector
4.多个测试用例的执行方案:
由于采用了HTMLTestRunner,一种方案是将所有的测试用例全部加入到一个Testsuit生成完整的测试报告.
或者采用另一种方案,执行py文件,每个文件生成一个报告,最后再将多份报告进行整合.(报告的整合部分另外说明)
如果不采用多线程,第一种方案比较简单,不用考虑测试报告的合并问题.(第一种方案另外说明)
但是如果采用多线程就,只能另一种方案了.多线程结合Selenium grid,这样测试效率更高.
如下代码,5个线程,执行py文件500次.
1 import threading,sys 2 from time import ctime,sleep 3 from subprocess import Popen,PIPE 4 5 lock=threading.Lock() 6 class MyThread(threading.Thread): 7 def __init__(self,filename,timeout): 8 threading.Thread.__init__(self) 9 self.filename=filename 10 self.timeout=timeout 11 def run(self): 12 p=Popen("python "+filename,shell=True,stdout=PIPE) 13 print p.stdout.readlines() 14 sleep(timeout) 15 if __name__=='__main__': 16 print 'main start time:%s' %ctime() 17 file=[] 18 for j in range(500): 19 file.append("E:\python\sub.py") 20 finishjob=0 21 while finishjob<len(file): 22 for i in range(5): 23 #此处加锁是为了取列表的时候避免重复 24 lock.acquire() 25 filename=file[i+finishjob] 26 timeout=i+1+finishjob 27 lock.release() 28 my_thread=MyThread(filename,timeout) 29 my_thread.start() 30 my_thread.join() 31 finishjob+=5 32 print 'main end time:%s' %ctime()
sub.py
1 #! /usr/bin/env python 2 #coding=utf-8 3 import sys,random,threading 4 from time import ctime,sleep 5 if __name__=='__main__': 6 thread=threading.current_thread() 7 print 'Start:%s' %(str(ctime())[14:19]) 8 rtime=random.randint(5,30) 9 sleep(rtime) 10 print 'sleep:%s' %(str(rtime)) 11 print 'End:%s' %(str(ctime())[14:19])
执行结果:
main start time:Wed Jun 22 09:50:17 2016 [[[[['Start:50:18 ''Start:50:17 ''Start:50:17 ''Start:50:18 ''Start: 50:18 ', 'sleep:29 ', 'End:50:47 '], 'sleep:29 ', 'End:50:47 '] , 'sleep:8 ', 'End:50:26 '] , , 'sleep:26 ', 'End:50:44 ']'sleep:5 ', 'End:50:23 '] [[[[['Start:50:52 ''Start:50:52 ''Start:50:52 ''Start:50:52 ''Start: 50:52 ', 'sleep:20 ', 'End:51:12 '], 'sleep:10 ', 'End:51:02 '] , 'sleep:14 ', 'End:51:06 ' , 'sleep:9 ', 'End:51:01 '], 'sleep:22 ', 'End:51:14 '] ] .....
从结果可以看出,一次执行5个py文件,必须等5个全部执行完毕之后才继续执行,如果有一个文件耗时比较长的话整个过程就卡住了.
所以就需要用队列来解决该问题.
1 #! /usr/bin/env python 2 #coding=utf-8 3 import threading 4 from multiprocessing import Queue 5 from time import ctime,sleep 6 from subprocess import Popen,PIPE 7 lock=threading.Lock() 8 class MyThread(threading.Thread): 9 def __init__(self,queue): 10 threading.Thread.__init__(self) 11 self.queue=queue 12 def run(self): 13 while True: 14 if not self.queue.empty(): 15 filename=self.queue.get() 16 p=Popen("python "+filename,shell=True,stdout=PIPE) 17 #由于此处非线程安全,打印结果会有点乱 18 #如果用锁会导致线程等待,影响效率,此处只是示例 19 print p.stdout.readlines() 20 else: 21 print 'end' 22 break 23 if __name__=='__main__': 24 print 'main start time:%s' %ctime() 25 file=[] 26 for j in range(50): 27 file.append("E:\python\sub.py") 28 finishjob = 0 29 queue = Queue() 30 for filename in file: 31 queue.put(filename) 32 my_threads=[] 33 for x in range(5): 34 my_thread=MyThread(queue) 35 #设置守护线程,主线程退出后其它线程也会退出 36 my_thread.daemon=True 37 my_threads.append(my_thread) 38 my_thread.start() 39 for t in my_threads: 40 t.join() 41 print 'main end time:%s' %ctime()
main start time:Wed Jun 22 09:59:11 2016 [[[['Start:59:11 '['Start:59:11 ''Start:59:11 ''Start:59:11 ', 'Star t:59:11 ', 'sleep:10 ''sleep:6 ', 'slee, 's, 'End:59:21 '] leep:25 'p:27 ', 'End:59:38 '] , 'End:59:17 '] , , 'sl'End:59:36 'eep:29 ', ]'End:59:40 '] ['Start:59:41 ', 'sleep:18 ', 'End:59:59 '] ['Start:59:59 ', 'sleep:11 ', 'End:00:10 '] .....
未完待续