• 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
    ']
    
    .....

    未完待续

  • 相关阅读:
    [机器学习] k-近邻算法(knn)
    [博客] 博客园侧边栏公告设置访问人数及访客国家来源
    Ubuntu搭建hugo博客
    CodeForces
    Javaweb开发入门___1
    JDBC的学习
    Mysql的学习7___权限和数据库设计
    Mysql的学习6____事物,索引,备份,视图,触发器
    Mysql的学习5___Mysql常用函数,聚合函数,sql编程
    Mysql的学习3___数据的管理,主键 外键 以及增改删
  • 原文地址:https://www.cnblogs.com/newvoyage/p/5606105.html
Copyright © 2020-2023  润新知