Selenium with Python学习点滴

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\r\n''Start:50:17\r\n''Start:50:17\r\n''Start:50:18\r\n''Start: 
50:18\r\n', 'sleep:29\r\n', 'End:50:47\r\n'], 'sleep:29\r\n', 'End:50:47\r\n'] 
, 'sleep:8\r\n', 'End:50:26\r\n'] 
, , 'sleep:26\r\n', 'End:50:44\r\n']'sleep:5\r\n', 'End:50:23\r\n']


[[[[['Start:50:52\r\n''Start:50:52\r\n''Start:50:52\r\n''Start:50:52\r\n''Start: 
50:52\r\n', 'sleep:20\r\n', 'End:51:12\r\n'], 'sleep:10\r\n', 'End:51:02\r\n'] 
, 'sleep:14\r\n', 'End:51:06\r\n' 
, 'sleep:9\r\n', 'End:51:01\r\n'], 'sleep:22\r\n', 'End:51:14\r\n'] 
]

.....

 

从结果可以看出,一次执行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\r\n'['Start:59:11\r\n''Start:59:11\r\n''Start:59:11\r\n', 'Star 
t:59:11\r\n', 'sleep:10\r\n''sleep:6\r\n', 'slee, 's, 'End:59:21\r\n'] 
leep:25\r\n'p:27\r\n', 'End:59:38\r\n'] 
, 'End:59:17\r\n'] 
, , 'sl'End:59:36\r\n'eep:29\r\n', ]'End:59:40\r 
\n'] 
['Start:59:41\r\n', 'sleep:18\r\n', 'End:59:59\r\n'] 
['Start:59:59\r\n', 'sleep:11\r\n', 'End:00:10\r\n']

.....

 

未完待续

posted on 2016-06-22 10:05  -voyage-  阅读(433)  评论(0)    收藏  举报