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     for x in range(5):
33         my_thread=MyThread(queue)
34         #如果设置守护线程,主线程退出后其它线程也会退出,所以该处注释掉
35         #my_thread.daemon=True
36         my_thread.start()
37     print ‘main end time:%s‘ %ctime() 
main start time:Wed Jun 22 09:59:11 2016
main end 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‘]

.....

未完待续

时间: 2024-08-28 05:15:22

Selenium with Python学习点滴的相关文章

python学习点滴记录-Day01

参考链接 https://triaquae.gitbooks.io/python/content/chapter1.html 一.python的安装 1.windows平台的到python官网下载windows版本安装介质,按照提示安装完毕即可使用. 2.linux平台的可以通过yum或者python官网下载tar包进行安装. 无论是windows还是linux下,为了方便使用,建议添加到环境变量中. windows:计算机属性--高级系统设置--系统--环境变量--PATH中添加python的

python学习点滴记录-Day03

函数基础 一. 使用函数带来的好处 #使代码组织结构清晰#减少代码冗余#可以统一管理且降低维护难度可以把函数当作日常生活中的工具,具备某种功能的物件,直接拿来使用即可. 二.函数的分类 内置函数:python解释器内置了大量函数方便开发者直接使用 自定义函数:根据自身需求自己编写的函数 三.函数的使用 定义函数 函数的定义与变量的定义类似,需要提前定义再调用 定义函数时只检测语法,不执行代码 def 函数名(arg1,arg2,arg3): '''注释''' 函数体 return 返回值 调用函

python学习点滴记录-Day08

本次课大纲 接口与归一化设计 多态与多态性 封装 静态属性property 面向对象高级 异常处理 网络编程 接口与归一化设计 1.什么是接口 =================第一部分:Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface接口的特征: * 1)是一组功能的集合,而不是一个功能 * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作 * 3)接口只定义函数,但不涉及函数实现 * 4)这些功能是相关的,都

python学习点滴记录-Day17-django-part2

url配置系统之无名分组 url配置系统之有名分组 url配置系统之分发app url配置系统之url反向解析 视图函数之请求对象 视图函数之响应对象 模板语法之渲染变量 模板语法之变量过滤器 ORM URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. ''' urlpatterns = [ url(正则表达式, views视图函数,参

python学习点滴记录-Day20(分页、cookie/session、ajax)

上节课内容回顾:ORM增删改查 Django提供的分页器使用以及分析讲解 Cookie和session讲解与在Django中的使用 ajax的讲解与简单使用 Django分页器(paginator) 要使用Django实现分页器,必须从Django中导入Paginator模块 from django.core.paginator import Paginator 假如现在有150条记录要显示,每页显示10条 >>> from django.core.paginator import Pa

python学习点滴记录-Day02补充-文件操作

字符编码: 把人类的字符翻译成计算机能认识的数字 字符编码表 存放着人类字符和计算机数字的对应关系表 ascii.gbk.utf-8.unicode unicode>encode(utf8)>bytes bytes>decode(utf8)>unicode 文件处理补充: 字符以什么格式编码的,就要以什么格式解码 文件的打开模式 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文

python学习点滴记录-Day12-前端基础之html

html 定义: 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然后根据标记符解释和显示内容.但需要注意的是,对于不同的浏览器,对同一标签可能会有不完全相同的解释(兼容性) 静态网页文件扩展名:.html 或 .htm HTML 不是一种编程语言,而是一种标记语言 (markup language) HTML 使用标记标签来描述网页 html结构 <!DOCTYPE

python学习点滴记录-Day18-django-orm

第18天课程内容: 模板语言的常用标签 自定义过滤器与标签 模板语言之继承 ORM的查询API 单表查询之双下划线 一对多的添加数据方法 mtv补充 修改pycharm连接db为mysql时遇到的问题 解决: 在项目的__init__.py文件中加 import pymysql pymysql.install_as_MySQLdb() post提交表单数据时,默认会提示403 forbidden,需要在form表单处添加{% csrf_token %},render方法会为它渲染一个随机字符串一

python学习点滴记录-Day21-项目

待整理 ajax的跨域三种方式 单独的cookie验证,写入与调取验证 form组件 用来校验用户提交的数据 可以做到保留正确信息 ,提示错误信息 以上为上午内容 下午内容 梳理博客项目所需要的表,表与表之间的关系 验证码