python+selenium自动化软件测试 :多线程

这篇具有很好参考价值的文章主要介绍了python+selenium自动化软件测试 :多线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前戏:线程的基础

运行多个线程同时运行几个不同的程序类似,但具有以下优点:
进程内共享多线程与主线程相同的数据空间,如果他们是独立的进程,可以共享信息或互相沟通更容易.
线程有时称为轻量级进程,他们并不需要多大的内存开销,他们关心的不是过程便宜.
一个线程都有一个开始,执行顺序,并得出结论。它有一个指令指针,保持它的上下文内正在运行的跟踪.
(1)、它可以是抢占(中断)
(2)、它可以暂时搁置(又称睡眠),而其他线程正在运行
看一下以下的小案例:

import thread
from time import sleep, ctime

def loop0():
     print "loop 0开始时间:",ctime() #第一个函数loop0开始时间
     sleep(4) # 休眠4秒
     print "loop 0 结束时间:_’,ctime()

def loopl():
     print "loop 1 开始时间:",ctime()
     sleep(2)
     print "loop 1 结束时间:_’,ctime()

def main():
     print "程序开始时间:",ctime()
     thread.start_new_thread(loop0,()) # 第二个参数是必不可少的,即使loope没有传递参数,仍然要写一个空元组
     thread.stant_new_thnead(loopl,())
     sleep(6) #这里休眠6秒的原因是确保两个线程己经执行完毕,主线程才接着执行下面的语句
     print "程序结束时间:",ctime()

if __name__ == '__main__':
     main()

在web测试中,不可避免的一个测试就是浏览器兼容性测试,在没有自动化测试前,我们总是苦逼的在一台或多台机器上安装N种浏览器,然后手工在不同的浏览器上验证主业务流程和关键功能模块功能,以检测不同浏览器或不同版本浏览器上,我们的web应用是否可以正常工作。如果我们使用selenium webdriver,那我们就能够自动的在IE、firefox、chrome、等不同浏览器上运行测试用例。为了能在同一台机器上不同浏览器上同时执行测试用例,我们需要多线程技术。下面我们基于python的多线程技术来尝试同时启动多个浏览器进行selenium自动化测试。

#-*- coding:utf-8

from selenium import webdriver
import sys
from time import sleep
from threading import Thread

reload(sys)
sys.setdefaultencoding("utf-8")

def test_baidu_seanch(browsen, url):
    driver = None
    #可添加更多浏览器支持进来
    if browser == "ie":
        driver = webdriver.Ie()
    elif browser == "finefox":
        driver = webdriver.Firefox()
    elif browser == "chrome":
        driver = webdriver.Chnome()

    if driver == None:
        exit()

    driver.get(url)
    sleep(3)

    driver.find_element_by_id("xxx").send_keys(u"xxxx")
    sleep(3)

    driver.find_element_by_id("xxx").click()
    sleep(3)

    driver.quit()

if __name__ == "__main__":
    #浏览器和首页url
    data = {
    "ie":"http://www.xxx.com",
    "firefox": "http: //www.xxx.com",
    "chrome":"http://www.xxxx.com"
}

#构建线程
threads =[]
for b, url in data.items():
    t = Thread(target=test_baidu_search,angs=(b, url))
    threads.append(t)

#启动所有线程
for thr in threads:
    thr.start()

8.1 多线程进阶学习

 threading 高级线程接口

import threading

class MyThnead(threading.Thread):

   def __init__(self, name=None):
      threading.Thread.__init__(self)
      self.name = name

   def run(self):
      print self.name

   def test():
      for i in range(0, 100):
           t = MyThread("thread_" + str(i))
           t.start()

if __name__ == '__main__':
    test()

Lock 线程锁
这里创建实现了一个计数器 count 这个全局变量会被多个线程同时操作,使其能够被顺序相加,需要靠线程锁的帮助。

#-*- encoding: utf-8
import threading
import time

class Test(threading.Thread):
    def __init__(self, num):
       threading.Thread.—init—(self)
       self._run_num = num

    def run(self):
        global count, mutex
        threadname = threading.currentThnead().getName()

        for x in nange(int(self._run_num)):
            mutex.acquire()
            count = count + 1
            mutex.release()
            print (thneadname, x, count)
            time.sleep(l)

if __name__ == '__main__':
    global count^ mutex
    threads =[]
    num = 5
    count =0
    #创建锁
    mutex = threading.Lock()
    #创建线程对象
    for x in nange(num):
        threads.append(Test(10))
    #启动线程
    for t in threads:
        t. start()
    #等待子线程结束
    for t in threads:
        t.join()

Queue队列

#!/usr/bin/env python
import Queue
import threading
import urllib2
import time

hosts = ["http://xxxx.com", "http://xxxxx.com","http://xxxxxx.com","http://xxxxx.com", "http://xxxxx.com"]
queue = Queue.Queue()

class ThreadUrl(thneading.Thread):
     ""”Threaded Uni Grab
     def __init__(self, queue):
          threading.Thread.__init__(self)
          self.queue = queue

def run(self):
     while True:
     #gnabs host from queue
     host = self.queue.get()
     url = urllib2.urlopen(host)
     #gnabs urls of hosts and prints first 1024 bytes of page
     uni = urllib2.urlopen(host)
     #signals to queue job is done
     self.queue.task_done()
     start = time.time()

def main():
#spawn a pool of threads, and pass them queue instance
     for i in nange(5):
     t = ThreadUrl(queue)
     t.setDaemon(True)
     t.start()

#populate queue with data
     for host in hosts:
          queue.put(host)

#wait on the queue until everything has been processed
queue.join()

main()

print "Elapsed Time: %s" % (time.time() - start)

8.2 使用队列与线程

当线程需要共享数据或资源时,线程可能会变得复杂。线程模块提供许多同步原语,包括信号量,条件变量,事件和锁。虽然存在这些选项,但它被认为是最佳做法,而是专注于使用队列。队列更容易处理,并且使线程编程更安全,因为它们有效地将资源访问单个线程,并允许更清晰和更可读的设计模式。
首先创建一个程序,该程序将按顺序或一个接一个地获取网站的URL,并打印页面的前1024个字节。这是一个经典的例子,可以使用线程更快地完成任务。首先,让我们一起使用这个urllib2 模块来抓住这些页面,然后再使用代码:

import urllib2
import time

hosts = ["http://xxxx.com", "http://xxxxx.com","http://xxxxxx.com","http://xxxxx.com", "http://xxxxx.com"]
start = time.time()

for host in hosts:
   url = urllib2.urlopen(host)
   print url.read(1024)

print "Elapsed Time: %s" % (time.time() - start)

导入两个模块首先, urllib2模块是什么是繁重的抓住网页。其次,通过调用创建开始时间值 time.time(),然后再次调用它,并减去初始值以确定程序执行多长时间。最后,在查看程序的速度时,“两个半秒”的结果是不可怕的,但是如果您有数百个网页来检索,则考虑到目前的平均值,大概需要50秒。看看如何创建一个线程版本加快速度:

import Queue
import threading
import urllib2
import time

hosts = ["http://xxxx.com", "http://xxxxx.com","http://xxxxxx.com","http://xxxxx.com", "http://xxxxx.com"]
queue = Queue.Queue()

class ThreadUrl(thneading.Thread):
     ""”Threaded Uni Grab
     def __init__(self, queue):
          threading.Thread.__init__(self)
          self.queue = queue

def run(self):
     while True:
     #gnabs host from queue
     host = self.queue.get()
     url = urllib2.urlopen(host)
     #gnabs urls of hosts and prints first 1024 bytes of page
     print url.read(1024)
     #signals to queue job is done
     self.queue.task_done()

def main():
#spawn a pool of threads, and pass them queue instance
     for i in nange(5):
     t = ThreadUrl(queue)
     t.setDaemon(True)
     t.start()

     for host in hosts:
          queue.put(host)
    queue.join()

main()

print "Elapsed Time: %s" % (time.time() - start)

上面的案例并不比第一个线程示例复杂得多,这要归功于使用排队模块。这种模式是使用Python的线程的一种非常常见的推荐方式。步骤描述如下:
1. 创建一个实例,Queue.Queue()然后用数据填充它。

2.将填充数据的实例传递到您从继承中创建的线程类threading.Thread。

3.产生一个守护进程池线程。

4. 一次将一个项目拉出队列,并使用线程内的数据,运行方法来完成工作。

5.完成工作后,向queue.task_done()任务完成发送一个信号到队列。

6. 加入队列,这意味着等到队列为空,然后退出主程序。

只是一个关于这种模式的注释:通过将守护进程线程设置为true,它允许主线程或程序退出,如果只有守护进程线程存活。这将创建一种控制程序流程的简单方法,因为您可以在退出之前连接队列,或等到队列为空。具体过程最好在队列模块的文档中描述,如相关主题所示:
join()
“块直到队列中的所有项目已经被处理完毕,每当一个项目被添加到队列中时,未完成任务的计数就会上升,当消费者线程调用task_done()来指示项目被检索时,所有的工作都是完成的,当未完成任务的计数下降到零时,join()解除阻塞。

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

python selenium 多线程,自动化测试,python自动化测试,python,selenium,自动化,测试工具

 文章来源地址https://www.toymoban.com/news/detail-575023.html

到了这里,关于python+selenium自动化软件测试 :多线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 软件测试 自动化测试selenium API

    1.1.1 CSS 选择器定位元素 CSS 选择器 就是一个语法 浏览器 (ctrl + f)可以进行选择 类选择器:.class值(.s_ipt) id 选择器:#id值(#kw) 父类选择器 子类选择器:父类选择器表达式 子类选择器表达式 标签选择器:标签名(form) 1.1.2 XPath 定位元素 XPath 是一种在XML 文档中定位元

    2024年04月28日
    浏览(50)
  • 软件测试 自动化测试selenium篇(一)

    目录 一、什么是自动化测试  单元测试  接口自动化  UI自动化 二、如何实施自动化测试  自动化测试需要了解的技能 三、selenium介绍 webdriver的工作原理:  四、Selenium+Java环境搭建                    验证环境是否搭建成功 创建java项目,添加pom文件中添加依赖 常见问题

    2024年02月07日
    浏览(68)
  • 软件测试(五)自动化 selenium

    自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器(代码)执行的过程。(简单而言其实就是降低重复性的工作(大部分是Python)) 自动化测试的具体实现,应该是包含下

    2024年02月08日
    浏览(62)
  • 软件测试/测试开发丨Selenium Web自动化测试基本操作

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/26901 模拟功能测试中对浏览器的操作 get方法打开浏览器 refresh方法刷新页面 用back方法回退到上一个界面 maximize_window方法使窗口最大化 minimize_window方法使窗口最小化 标签: a 属性:href 类属性

    2024年02月10日
    浏览(56)
  • 软件测试/测试开发丨Selenium Web自动化测试 高级控件交互方法

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27045 使用场景 对应事件 复制粘贴 键盘事件 拖动元素到某个位置 鼠标事件 鼠标悬停 鼠标事件 滚动到某个元素 滚动事件 使用触控笔点击 触控笔事件(了解即可) https://www.selenium.dev/documentati

    2024年02月09日
    浏览(98)
  • 自动化测试工具Selenium的基本使用方法,软件测试基础

    browser.find_element(By.ID,‘kw’).send_keys(“美女”) browser.find_element_by_id(‘kw’).send_keys(‘性感’) 2.通过标签name属性进行定位 browser.find_element_by_name(“wd”).send_keys(“Linux”) browser.find_element(By.NAME,‘wd’).send_keys(“美女”) 3.通过标签名进行定位 browser.find_element_by_tag_name(“input”).

    2024年04月22日
    浏览(63)
  • 软件测试自动化Java篇【Selenium+Junit 5】

    为什么选择selenium作为我们的web自动化测试工具? 开源免费 支持多浏览器 支持多系统 支持多语言【Java,Python,C#,Rubby,JavaScript,Kolin】 selenium包提供了很多可供测试使用的API Chrome浏览器 Chrome驱动【驱动器版本要和浏览器版本对应越详细越好】 然后把驱动包放在安装jdk的

    2024年01月18日
    浏览(48)
  • 软件测试/测试开发丨Selenium Web自动化多浏览器处理

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27185 用户使用的浏览器(firefox,chrome,IE 等) web 应用应该能在任何浏览器上正常的工作,这样能吸引更多的用户来使用 是跨不同浏览器组合验证网站或 web 应用程序功能的过程 是兼容性测试的一个

    2024年02月09日
    浏览(61)
  • 软件测试——功能测试,使用Java,IDEA,Selenium进行web自动化测试

    视频地址:03-web元素定位ID_哔哩哔哩_bilibili p1.下载jdk,maven,idea p2.配置java-selenium环境正式开始: (1)创建代码: (2)第一次运行会报错:要下载东西  (3) Windows系统的输入如下:  (4)完成如下:(这个用的是Linux系统的) p3:web元素定位ID (1)先改一下之前的代码  (

    2024年02月08日
    浏览(79)
  • 自动化测试:Selenium高级操作!,看完阿里P9大牛的“软件测试成长笔记”我悟了

    分享他们的经验,还会分享很多直播讲座和技术沙龙 可以免费学习!划重点!开源的!!! qq群号:110685036 Switch_to切换frame 如果元素在html的frame或iframe中,则无法直接定位到元素。需要先切换到该frame中,再进行定位及其他操作。 相关方法: driver.switch_to.frame(frame_reference)

    2024年04月25日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包