zoukankan      html  css  js  c++  java
  • 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
    ''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
    ']
    
    .....

    未完待续

  • 相关阅读:
    数据绑定表达式语法(Eval,Bind区别)
    使用博客园的第一件事 自定义主题
    sql2000 跨服务器复制表数据
    使用UpdatePanel 局部刷新出现中文乱码的解决方法!!
    MMC不能打开文件MSC文件
    sql 日期 、时间相关
    loaded AS2 swf call function in AS3 holder
    Rewrite the master page form action attribute in asp.net 2.0
    100万个不重复的8位的随机数
    flash 中实现斜切变型
  • 原文地址:https://www.cnblogs.com/newvoyage/p/5606105.html
Copyright © 2011-2022 走看看