python自动测试v_python下selenium自动化测试自我实践

周末实验自动化提交数据时,本来没打算写记录的,不过遇到一些问题,觉得可以提提。基本操作就不用写了,搜索过程中都发现了两个博客都出了selenium+python的书,说明操作一搜一大把。

1. 等待页面加载完成

本来用的sleep(),自己判断的有的需要时间长点就给3-4秒,时间短的页面内等待就0.5秒。但有时候网络不稳定可能需要的时间更长就会抛错。发现文档中有说:

显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。 最糟糕的案例是使用time.sleep(),它将条件设置为等待一个确切的时间段。

尴尬=-=! 但是最后我还是采用了sleep(),以后需要优化再改吧。

一些跳转链接的地方我用了 driver.current_url来获取当前URL和预期的作对比来完成操作。

2.开左右两个窗口各占一半屏

使用maximize_window将浏览器最大化,然后用get_window_size获取到宽高。接下来就只是简单的用set_window_rect置左右窗口位置和大小了。

def start(self, align=None):

""" 配置并启动 """

option = webdriver.ChromeOptions()

option.add_argument('disable-infobars') # 无提醒

#option.add_argument('headless') # 静默运行

self.driver = webdriver.Chrome(chrome_options=option)

# 置屏幕左右

if align:

# 全屏

self.driver.maximize_window()

# 获取大小

size = self.driver.get_window_size()

width = size['width']

height = size['height']

if align == 'left':

self.driver.set_window_rect(0, 0, int(width/2), height)

elif align == 'right':

self.driver.set_window_rect(int(width/2), 0, int(width/2), height)

else:

pass

return self.driver

3. 多线程

上面明显是一个执行之后再另外一个,刚好需要加多线程,正好测试测试。 类中的方法加多线程试出来一种办法:

study = StudyMap('left')

study2 = StudyMap('right')

# for i in range(10):

# study.addCompleteMap()

#构建线程

threads =[]

t = Thread(target=study.addCompleteMap)

threads.append(t)

t = Thread(target=study2.addCompleteMap)

threads.append(t)

#启动所有线程

for t in threads:

t.start()

先初始化两个类,这个过程是单线程的,之后调用addCompleteMap方法使用多线程。ok。

想多次执行addCompleteMap函数怎么办呢,比如上面我注释掉的

for i in range(10):

study.addCompleteMap()

加个函数试试,

study = StudyMap('left')

study2 = StudyMap('right')

def runx(cls):

for i in range(10):

cls.addCompleteMap()

# 构建线程

threads = []

t = Thread(target=runx, args=(study,))

threads.append(t)

t = Thread(target=runx, args=(study2,))

threads.append(t)

# 启动所有线程

for t in threads:

t.start()

可以的,将runx方法多线程,参数为类对象。所以不管是普通方法还是类中的成员方法,用多线程来实现没有多大区别。这不,都转了一例。具体更深入的问题,留到以后研究或者遇到了再研究吧。

4. 多线程取数据问题

上面的还有问题,业务中第二步有用数据,两个选择了同样的数据不能保存成功。以及有的页面小屏看不到确定按钮。(没打算自动化测试,只是想填数据。还真给测出了BUG)

1) 针对数据混乱问题,加锁

a7542f554f201481122944a7bdbda828344.gif

图:多线程调用数据重复,线程加锁前

lock = threading.Lock()

# 选择试卷需要加锁

lock.acquire()

logging.info('[获取试卷]')

... ... 其他逻辑处理

logging.info('[保存]')

lock.release()

ac21bfe0d9717495e19378454115abcf7c2.gif

图:多线程加锁后,数据调用完整

加锁导致速度变慢,考虑取数据时可以分开取:第一个线程取第1行,第二个线程取第2行也可以,就取了锁。用线程名取不同的数据。为了避免数据不够最后多备1条数据。还有其他业务需同时取3条数据,同理。

线程加name:

# 构建线程

threads = []

t = Thread(target=runx, args=(study,), name="t1")

threads.append(t)

t = Thread(target=runx, args=(study2,), name='t2')

threads.append(t)

判断获取不同的数据,为了清晰,在另外一处业务取不同的3条数据处来查看:

原写法:

self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[1]").click()

self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[2]").click()

self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[3]").click()

修改为:根据线程获取不同数据

if threading.current_thread().name == 't1':

tn = 1

else:

tn = 4

# 线程1->取123行, 2->456行

self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[{0}]".format(tn)).click()

self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[{0}]".format(tn+1)).click()

self.driver.find_element_by_xpath("//table[starts-with(@ng-table-dynamic,'tableParams')]/tbody/tr[{0}]".format(tn+2)).click()

0cadec4c5ffa0ac34e6be888fe8ff4be2bc.gif

图:不用锁,不同线程选择不同数据

2) 针对按钮看不到,放全屏操作完后,再还原

为了重置窗口大小,将1节中的方法拆分

from selenium import webdriver

from time import sleep

class AutoSubmit():

""" 自动提交测试 """

def __init__(self):

self.rect = (0, 0, 800, 600)

pass

def start(self, align=None):

""" 配置并启动 """

logging.info('配置并启动Chrome')

option = webdriver.ChromeOptions()

option.add_argument('disable-infobars') # 无提醒

#option.add_argument('headless') # 静默运行

self.driver = webdriver.Chrome(chrome_options=option)

# 置屏幕左右

if align:

# 全屏

self.driver.maximize_window()

# 获取大小

size = self.driver.get_window_size()

width = size['width']

height = size['height']

if align == 'left':

self.rect=(0, 0, int(width/2), height)

elif align == 'right':

self.rect=(int(width/2), 0, int(width/2), height)

else:

pass

# 设置窗口

self.setWindow()

return self.driver

def setWindow(self, *, maxWindow=False, minWindow=False):

""" 设置窗口位置和大小 """

if maxWindow:

self.driver.maximize_window()

elif minWindow:

self.driver.minimize_window()

else:

self.driver.set_window_rect(*self.rect)

start()中左右屏幕只改变self.rect变量,调用setWdindow()方法重置大小,不传参则为当前rect大小,传maxWindow/minWindow则放大缩小。

调用打开左右两个窗口

# 左右两个窗口

driver1 = a1.start('left')

driver2 = a2.start('right')

窗口2全屏加载bing首页,并置原大小

# 需要全屏时

a2.setWindow(maxWindow=True)

driver2.get('http://bing.com')

sleep(2)

a2.setWindow()

6fa0215e5a2d731af5d748aa1bbaad2e3d9.gif

参考资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

graphpad细胞增殖曲线_肿瘤干细胞?居然被这两个新加坡人轻松干掉了?

近日,著名医学期刊《自然•医学》上发表了一篇关于肿瘤干细胞的文章。来自新加坡的研究团队发现,人类非小细胞肺癌的肿瘤干细胞需要大量的蛋氨酸,以维持自身组蛋白的甲基化,这对于肿瘤干细胞的生长和致瘤作用至关重要。同时&#…

isight参数优化理论与实例详解_案例1(ISIGHT集成ADAMS CAR方法实现)

本文字数1304字25图,建议阅读时间7分钟强调一下是ISIGHT,不是INSIGHTINSIGHT是ADAMS内置的一个试验设计模块,它提供了一组统计工具,用于分析仿真结果,辅助优化和改进系统ISIGHT是功能强大的计算机辅助优化平台&#xf…

修改图片src_【学习园地】企业SRC搭建

xSRC-企业SRC搭建腾讯xSRC 开源版是腾讯安全应急响应中心(TSRC)面向合作伙伴推出的安全应急响应中心(SRC)建站软件,软件源代码开放,可支持合作伙伴轻松构建SRC平台,省去大量开发运维工作,并支持个性化功能及页面设置,企…

2 数据源配置_论多数据源(读写分离)的实现方案

好的,作为一个合格的bug生产者,我们直接进入主题,多数据源和读写分离实现方案。首先多数据源和读写分离什么时候我们才需要呢?多数据源:一个单体项目过于复杂,需要操作多个业务库的时候,就需要多…

docker安装gitlab_docker 安装部署gitlab

下载镜像并且启动//下载镜像(镜像较大,如果网速不行可以切换阿里云镜像仓库) docker pull gitlab/gitlab-ce:latest //启动镜像 docker run --name gitlab -d -p 18080:80 -p 1443:443 -p 2222:22 -v /data/gitlab/config:/etc/gitlab -v /data/gitlab/logs:/var/lo…

easyexcel导出百万级数据_百万级别数据Excel导出优化

这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现了服务经常因为大数据量的数据导出频繁Ful…

运行catia_CATIA清除错误目录及防串链接

清除错误目录大家好今天我来教大家如何清除CATIA错误目录,由于我们在日常工作中经常会互相发送数据,而CATIA的缓存功能通常会记录这些文件的路径,所以我们打开别人发的数据时在桌面的右下角通常会有警告的提醒,那我们如何来清除缓…

python 键盘输入数字_九宫格键盘输入

九宫格键盘输入 Letter Combinations of a Phone Number 给定一个数字字符串,返回数字可能代表的所有可能的字母组合。 数字到字母的映射(就像九宫格电话按钮一样)如下图。 Given a digit string, return all possible letter combinations t…

java2组随机数的共通数_java随机数产生-指数分布 正态分布 等

1 指数分布指数分布的概率密度函数:ylamda*exp(-lamda*x)x>0由此可以计算概率分布函数:y1-exp(-lamda*x)x>0y是 X首先,把y当作是在(0,1)区间的均匀分布的随机变量。然后,求y1-exp(-lamda*x)的逆函数&#xff0c…

c# combobox集合数据不显示_excel打开数据时显示乱码/问号amp;看起来一样却v不出来怎么办...

1、乱码问题:今天正好碰到这种情况,想起来写一写。有时从客户那里拿到的CSV等文件,直接用excel打开是这样的:其实观察一下会发现?的地方一般就是中文,实质上是中文字符显示不出来。有小伙伴一直是单独下个W…

if嵌套while循环语句_Python学习笔记015--while循环嵌套

while循环嵌套前面学习过if的嵌套了&#xff0c;想一想if嵌套是什么样子的&#xff1f;类似if的嵌套&#xff0c;while嵌套就是&#xff1a;while里面还有while<1>while嵌套的格式while 条件1:条件1满足时&#xff0c;做的事情1条件1满足时&#xff0c;做的事情2条件1满足…

long类型怎么转换成string_Python知识点-Python变量类型有哪些?

Python的内置变量类型是非常基础的知识点&#xff0c;善用变量类型转换在日常的工作学习中会给我们带来非常大的帮助。相对于其他语言&#xff0c;Python的变量类型既有自己的特色方法&#xff0c;也有借鉴前辈的优秀之处。今天酷仔整理总结了关于Python内置变量类型一文&#…

mysql连接服务密码_Hydra爆破常见服务密码

Hydra是一款专业的服务密码探测工具&#xff0c;支持FTP、LDAP、MYSQL、Oracle、POP3、SMB、SSH等网络服务&#xff0c;多用于信息安全检查工作中弱口令登陆测试。实验环境操作系统&#xff1a;Kali 2019.4目标网络&#xff1a;192.168.168.0/24爆破教程第一步 升级系统、软件版…

矩阵求逆c语言实现_[V-SLAM] Bundle Adjustment 实现

SLAM问题的后端有主要有滤波和优化两种方案。目前&#xff0c;普遍认为优化的方法在精度上要超过滤波方法&#xff0c;因为它可以进行多次的线性化。近年来出现的SLAM算法也大都是基于优化的算法&#xff08;如ORB-SLAM、DSO等&#xff09;。优化问题的核心便是Bundle Adjustme…

centos安装 mysql_Linux centos 安装 mysql 5.6

一、mysql下载1、方式一(简单粗暴)直接在linux 目录下wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz2、方式二(官方下载)浏览器打开网址&#xff1a;https://www.mysql.com如下图依次点击1、2、3、4步如下图设置对应版本点击…

tracepro杂散光分析例子_光刻机的蜕变过程及专利分析

来源&#xff1a;芯通社近两年&#xff0c;中国芯片产业受到了严重打击&#xff0c;痛定思痛之余也让国人意识到芯片自主研发的重要性。从2008年以来&#xff0c;十年间&#xff0c;芯片都是我国第一大宗进口商品&#xff0c;进口额远超于排名第二的石油。2018年我国进口集成电…

docker mysql日志_面试官问:了解Mysql主从复制原理么?我呵呵一笑

搭建Mysql主从同步之前&#xff0c;我们先来说他们之间同步的过程与原理&#xff1a;同步复制过程献上一张图&#xff0c;这张图诠释了整个同步过程主从复制过程&#xff1a;slave节点与主节点进行连接&#xff0c;建立主从关系&#xff0c;并把从哪开始同步&#xff0c;及哪个…

查看socket缓冲区数据_什么是socket缓冲区?

Socket 就是发送和接收网络数据&#xff0c;Socket 有发送缓冲也有接收缓冲&#xff0c;这些缓冲区有什么作用&#xff1f;1、什么是Socket缓冲区&#xff1f;熟悉 Socket 的读者都知道&#xff0c;Socket 的发送和接收&#xff0c;就是调用 send 和 recv 函数。实际操作中&…

哈工大大数据实验_科研常用 | 实验大数据分析方法

对于每个科研工作者而言&#xff0c;对实验数据进行处理是在开始论文写作之前十分常见的工作之一。但是&#xff0c;常见的数据分析方法有哪些呢&#xff1f;常用的数据分析方法有&#xff1a;聚类分析、因子分析、相关分析、对应分析、回归分析、方差分析。1、聚类分析(Cluste…

搭建github服务器_搭建一个属于自己的公网博客

相信每一位程序员都喜欢拥有一个属于自己的博客。当然&#xff0c;在我认为&#xff0c;内容以及模块都要自己进行可扩展定义才是真正属于自己的。那么想要一个博客就必须要有一个服务器和一个域名&#xff0c;这样的话才能让自己的博文内容发扬光大&#xff0c;但是服务器的性…