周末实验自动化提交数据时,本来没打算写记录的,不过遇到一些问题,觉得可以提提。基本操作就不用写了,搜索过程中都发现了两个博客都出了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) 针对数据混乱问题,加锁

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

lock = threading.Lock()

# 选择试卷需要加锁

lock.acquire()

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

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

logging.info('[保存]')

lock.release()

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

加锁导致速度变慢,考虑取数据时可以分开取:第一个线程取第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()

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

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()

参考资料

python自动测试v_python下selenium自动化测试自我实践相关推荐

  1. python自动测试e_python实现hive自动化测试

    本程序主要实现hive权限测试.系统中有管理员用户single和测试用户test.在路径/home/test/下,将用例和预期结果写在xml文件中. 执 行过程:kinit single用户,beel ...

  2. python自动测试ping IP

    python自动测试ping IP,将不通的IP保存到txt中. # -*- coding: utf-8 -*- # @Time : 2023/3/6 9:14 # @Author : JulyLi ...

  3. python自动测试g_使用Python进行自动化测试

    目前大家对Python都有一个共识,就是他对测试非常有用,自动化测试里Python用途也很广,但是Python到底怎么进行自动化测试呢?今天就简单的向大家介绍一下怎么使用Python进行自动化测试,本 ...

  4. python自动测试p-Python自动化测试

    什么是自动化测试? 自动化测试,一般是指软件测试的自动化.自动化测试是把以人为驱动的测试转化为机器执行的一种过程.实际上自动化测试就是用自动化测试工具代替手工测试,即是模拟手工测试,从而利用所写脚本执 ...

  5. python自动测试p-关于《Python自动化测试实战》

    作者有话说 笔者写这本书的初心是想通过自身经验分享一些在自动化测试领域中的实用技术,能够帮助那些正在从事自动化测试相关工作或者准备转型自动化测试的测试人员.任何一门技术涵盖的知识点都是非常广泛的,可能 ...

  6. python写界面输入测试脚本_python+Selenium自动化测试——输入,点击操作

    这是我的第一个真正意思上的自动化脚本. 1.练习的测试用例为: 打开百度首页,搜索"胡歌",然后检索列表,有无"胡歌的新浪微博"这个链接 2.在写脚本之前,需要 ...

  7. python自动测试p-使用python+requests实现接口自动化测试

    这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下. 一.整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用. Common:公共方法:主要放 ...

  8. python自动测试s_用 Python 开启测试自动化的未来

    使用 Python 脚本迈进先进的测试自动化技术 传统上,测试自动化工程师都是使用 shell 脚本和自主开发的工具进行自动测试.现在,测试团队可以使用 Python 软件更轻松.更稳健地完成他们的测 ...

  9. python自动化验证部署_Python selenium自动化测试环境安装部署

    1. Windows系统下python环境搭建 1.1首先访问http://www.python.org/download/去下载最新的python版本.本人使用的是2.7的python版本 1.2安 ...

最新文章

  1. C++11中std::initializer_list的使用
  2. AAAI2020 | SNERL:抛开mention级别的监督,实体链接、关系抽取我都行
  3. python运行慢-Python运行效率慢?因为你不知道这六大窍门!
  4. Zookeeper的特点
  5. JavaWeb(六)——HttpServletResponse、HttpServletRequest
  6. java代码中哪些不能犯的错误_Java程序员工作中千万不能犯的3个低级错误
  7. 优酷播控实践:基于规则引擎的投放管控模型
  8. 大量执行OSS PutObject时卡住的问题排查
  9. 标签管理体系之业务应用
  10. Centos下Nagios的安装与配置
  11. python计算机视觉编程——sift特征提取和ransac减少错配
  12. HCSE交换知识重点
  13. 【luogu3403】跳楼机 [同余最短路]
  14. 微信小程序之布局切换
  15. Idling along, (or what to do in the idle task)
  16. MindSpore如何实现自定义训练
  17. Cisco:CCNA专业英文词汇(1)
  18. 频率选择性衰落和时间选择性衰落详解
  19. centos使用yum命令安装报错 File /usr/bin/yum, line 30 except KeyboardInterrupt, e:
  20. 苹果小圆点怎么关闭_原来苹果手机点下屏幕就能截屏,用了3年才发现,没用过学一下...

热门文章

  1. python-聚类图像分割
  2. burp的intruder报错Payload set 1: Invalid number settings
  3. Leetcode--151. 翻转字符串里的单词
  4. laravel log 对象_swoole运行模式加速laravel应用的详细介绍(life)
  5. java大数模板_java大数模板
  6. MATLAB如何把图片显示在GUI上
  7. MATLAB报错Invalid ADAPTORNAME specified. Type 'imaqhwinfo' for a list of available ADAPTORNAMEs. Image
  8. 十个不可不看的Matlab GUI
  9. 二维数组按行和按列遍历的效率
  10. CompletableFuture 异步编程