专栏首页软件测试testclassSelenium对当前浏览器窗口截图

Selenium对当前浏览器窗口截图

豆蔻的年华,那些花季雨季,染指,殇逝,是最虚无缥缈的尘埃,吹之即散。

写在前面




在自动化测试中,截图可以帮助我们直观的定位错误、记录测试步骤。 同样,我们可以通过截取关键信息的图片,用以保留测试证迹。WebDriver提供了几种截图函数来截取当前窗口:

get_screenshot_as_file() save_screenshot()

第一种截图方法




#select.py
#www.testclass.cn
#Altumn
import time
from selenium import webdriverdriver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.maximize_window()
driver.get("https://www.testclass.cn")
#调用driver.get_screenshot_as_file(filename)方法,对当前浏览器打开界面进行截图;
并保存到D盘下,命名为:testclass.png
filename ="D:\\testclass.png"
try:
   picture=driver.get_screenshot_as_file(filename)  
   if picture == True:        
        print (picture,":截图成功!图片保存路径为:",filename)    
    else:
       print(picture,":截图失败!")
except Exception as e:
   print(e)driver.quit()

调用截屏函数get_screenshot_as_file()截图成功会返回True,如果发生IOError异常则返回False。图片存放的路径可以是绝对路径,也可以是相对路径。脚本运行完成后打开D盘,就可以找到命名为testclass.png的图片了。 执行结果如下:

DevTools listening on ws://127.0.0.1:12910/devtools/browser/5b50fb75-2b5c-4a50-a6a0-4b0918e4410e
True :截图成功!图片保存路径为: D:\testclass.png
PS C:\Users\WangXiao\Desktop\python> cd 'c:\Users\WangXiao\Desktop\python'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Programs\Python\Python36\python.exe' 'c:\Users\WangXiao\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py' '--default' '--client' '--host' 'localhost' '--port' '62091' 'c:\Users\WangXiao\Desktop\python\screen_capture.py'
DevTools listening on ws://127.0.0.1:12371/devtools/browser/bc26207b-e918-4400-86ca-c12c48edcbee
True :截图成功!图片保存路径为: D:\testclass.png

生成带时间戳的截图




以上功能实现了当前屏幕窗口截图,但是存在一个弊端:相同路径下生成的图片总会被新的图片覆盖。相同路径下批量生成的图片如何才能不被覆盖呢?这里我们可以通过增加时间戳的方式命名图片。这样不同时间生成的图片就不会被覆盖了。详细实现代码如下所示:

#select.py
#www.testclass.cn
#Altumn

import time
from selenium import webdriverdriver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.maximize_window()
driver.get("https://www.testclass.cn")
#生成时间戳;
picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
print(picture_time)
#调用driver.get_screenshot_as_file(filename)方法,对当前浏览器打开界面进行截图;
并保存到D盘下,命名为:"当前时间".png

filename ="D:\\" + picture_time +".png"
try:
   picture=driver.get_screenshot_as_file(filename)  
   if picture == True:        
        print (picture,":截图成功!图片保存路径为:",filename)    
    else:
       print(picture,":截图失败!")
except Exception as e:
   print(e)driver.quit()

执行结果如下所示:

PS C:\Users\WangXiao\Desktop\python> cd 'c:\Users\WangXiao\Desktop\python'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Programs\Python\Python36\python.exe' 'c:\Users\WangXiao\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py' '--default' '--client' '--host' 'localhost' '--port' '51578' 'c:\Users\WangXiao\Desktop\python\screen_capture.py'
DevTools listening on ws://127.0.0.1:12781/devtools/browser/976c71cb-1d9b-4b8c-b10d-5981ced1a9e52019-01-24-15:08:56
False :截图失败!
PS C:\Users\WangXiao\Desktop\python> cd 'c:\Users\WangXiao\Desktop\python'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Programs\Python\Python36\python.exe' 'c:\Users\WangXiao\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py' '--default' '--client' '--host' 'localhost' '--port' '52768' 'c:\Users\WangXiao\Desktop\python\screen_capture.py'
DevTools listening on ws://127.0.0.1:12711/devtools/browser/d0bc9d1b-eb4f-486b-ba70-54758eaca5f02019-01-24-15_22_27
True :截图成功!图片保存路径为: D:\2019-01-24-15_22_27.png

第二种截图方法




get_screenshot_as_file() save_screenshot()这两个函数的用法一模一样,详细代码如下所示:

#select.py
#www.testclass.cn
#Altumn
import time
from selenium import webdriverdriver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.maximize_window()
driver.get("https://www.testclass.cn")
#调用driver.save_screenshot(filename)方法,对当前浏览器打开界面进行截图;
并保存到D盘下,命名为:testclass.png
filename ="D:\\testclass.png"
try:
   picture=driver.save_screenshot(filename)  
   if picture == True:        
        print (picture,":截图成功!图片保存路径为:",filename)    
    else:
       print(picture,":截图失败!")
except Exception as e:
    print(e)driver.quit()

执行结果:

生成带时间戳的截图



get_screenshot_as_file() save_screenshot()这两个函数的用法一模一样,详细代码如下所示:

#select.py
#www.testclass.cn
#Altumn
import time
from selenium import webdriverdriver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.maximize_window()
driver.get("https://www.testclass.cn")
#生成时间戳;
picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
print(picture_time)
#调用driver.save_screenshot(filename)方法,对当前浏览器打开界面进行截图;
并保存到D盘下,命名为:"当前时间".png

filename ="D:\\" + picture_time +".png"

try:
   picture=driver.save_screenshot(filename)  
   if picture == True:        
        print (picture,":截图成功!图片保存路径为:",filename)    
    else:
       print(picture,":截图失败!")
except Exception as e:
   print(e)driver.quit()

执行结果:

文末彩蛋




如何在生成图片的同时,自动生成对应年月日的文件夹,这样更方便分类和查找图片。其实方法很简单,我们只需要在生成图片之前,先创建一个以”年月日”命名的文件夹,然后把”年月日时分秒”命名的图片放进这个文件夹里面存储。代码如下所示:

#select.py
#www.testclass.cn
#Altumn

import os
import time
from selenium import webdriverdriver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.maximize_window()
driver.get("https://www.testclass.cn")
#生成文件夹时间戳;
file_time = time.strftime("%Y-%m-%d", time.localtime(time.time()))
print("文件夹名称:",file_time)
#生成图片时间戳;图片以年月日时分秒命名;
picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
print("图片名称:",picture_time)
#在这里,我想把图片保存在D盘,所以我先把python默认的工作目录修改一下;os.chdir('D:\\')
result = os.getcwd()
#打印一下修改后当前python的工作目录;
print(result)
#生成文件夹:先检查对应的的路径下是否已存在文件夹,不存在则自动新建 file_time 文件夹;

try:
   File_Path = os.getcwd() + file_time + "\\"
   if not os.path.exists(File_Path):
       os.makedirs(File_Path)
       print("目录新建成功:%s" % File_Path)    
    else:
       print("目录已存在!")
except BaseException as msg:
   print("新建目录失败:%s" % msg)
#调用driver.get_screenshot_as_file(filename)方法,对当前浏览器打开界面进行截图;
并保存到D盘下,命名为:testclass.png

filename ="D:\\" + file_time + "\\" + picture_time +".png"

try:
   picture=driver.get_screenshot_as_file(filename)  
   if picture == True:        
        print (picture,":截图成功!图片保存路径为:",filename)    
    else:
       print(picture,":截图失败!")
except Exception as e:
   print(e)driver.quit()

首次执行结果:

PS C:\Users\WangXiao\Desktop\python> cd 'c:\Users\WangXiao\Desktop\python'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Prog'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Programs\Python\Python36\python.exe' 'cles\ptvsd_launcher.py' '--default' '--client' '--host' 'localhost' '--p:\Users\WangXiao\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py' '--default''--client' '--host' 'localhost' '--port' '57682' 'c:\Users\WangXiao\Desktop\python\screen_capture.py'
DevTools listening on ws://127.0.0.1:12533/devtools/browser/76bd24d9-5fc4-400a-b1d8-59e3c2908b42
文件夹名称: 2019-01-24
图片名称: 2019-01-24-16_49_15
D:\
目录新建成功:D:\2019-01-24\
True :截图成功!图片保存路径为: 
D:\2019-01-24\2019-01-24-16_49_15.png

文件夹已经存在时执行结果:

PS C:\Users\WangXiao\Desktop\python> cd 'c:\Users\WangXiao\Desktop\python'; ${env:PYTHONIOENCODING}='UTF-8'; ${env:PYTHONUNBUFFERED}='1'; & 'C:\Users\WangXiao\AppData\Local\Programs\Python\Python36\python.exe' 'c:\Users\WangXiao\.vscode\extensions\ms-python.python-2018.12.1\pythonFiles\ptvsd_launcher.py' '--default''--client' '--host' 'localhost' '--port' '58116' 'c:\Users\WangXiao\Desktop\python\screen_capture.py'
DevTools listening on ws://127.0.0.1:12985/devtools/browser/ce22980d-225e-4a73-ae4e-944ce3134f54
文件夹名称: 2019-01-24
图片名称: 2019-01-24-16_53_52
D:\
目录已存在!
True :截图成功!图片保存路径为: D:\2019-01-24\2019-01-24-16_53_52.png

本文分享自微信公众号 - 软件测试testclass(testclass_cn)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 两个闹钟,10 分钟教你写出 lodash 中的 debounce & throttle

    相比网上教程中的 debounce 函数,lodash 中的 debounce 功能更为强大,相应的理解起来更为复杂;

    Nealyang
  • 深入理解Node.js 进程与线程(8000长文彻底搞懂)

    进程与 线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概...

    Nealyang
  • 第29次文章:事务机制

    -连接到数据库上,并执行一条DML语句(insert、update或delete)。

    鹏-程-万-里
  • linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】

    转自:https://blog.csdn.net/weixin_42471952/article/details/81609141

    用户3033338
  • 用pandas处理时间格式数据

    我们在处理时间相关的数据时有很多库可以用,最常用的还是内置的datetime、time这两个。做数据分析时基本都会导入pandas库,而pandas提供了Tim...

    蛰虫始航
  • 我常用的4个备份工具

    不言而喻,备份对我们日常工作是非常重要的,前有GitLab误删300G数据实时恢复数据刺激过程,后有腾讯云故障丢失客户数据,遭千万索赔的尴尬场景。

    数据森麟
  • python 标准库大全

    郭大侠
  • 『 懒人10分钟—Linux学习篇(一) 』什么是Linux?

    最近老板娘替他的学生向我询问到关于服务器的学习,应该从何入手?脑子里立马闪现出了“鸟哥”二字。因此,也饶有兴趣的重温一遍关于鸟哥的书籍,便萌生了整理一次“鸟哥私...

    23号杂货铺
  • 【DB笔试面试625】在Oracle中,如何获取timestamp类型的精度到纳秒级?

    秒(s)的单位都有毫秒(ms,millisecond),微秒(μs,microsecond),纳秒(ns,nanosecond),它们之间的换算单位为千进制,1...

    小麦苗DBA宝典
  • Redis持久化最全面的知识详解

    持久化存储是将 Redis 存储在内存中的数据存储在硬盘中,实现数据的永久保存。我们都知道 Redis 是一个基于内存的 nosql 数据库,内存存储很容易造成...

    用户3817167

扫码关注云+社区

领取腾讯云代金券