Selenium对当前浏览器窗口截图

2019年1月24日 3.3k 次阅读 4 条评论 2 人点赞

写在前面

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

第一种截图方法

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

import time
from selenium import webdriver

driver=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 webdriver

driver=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-5981ced1a9e5
2019-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-54758eaca5f0
2019-01-24-15_22_27
True :截图成功!图片保存路径为: D:\2019-01-24-15_22_27.png

第二种截图方法

save_screenshot()get_screenshot_as_file()的用法一模一样,代码如下:

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

import time
from selenium import webdriver

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

执行结果:

生成带时间戳的截图

save_screenshot()get_screenshot_as_file()的用法一模一样,代码如下:

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

import time
from selenium import webdriver

driver=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 webdriver

driver=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
温馨提示:欢迎点击加入软件测试学习交流QQ群:软件测试学习交流群

风里云里,我在这里等你!

文章评论(4)

  • 王三岁

    我去试试看这个截图功能 :eek:

    2019年4月25日
  • 王土豆

    写的很详细

    2019年4月17日
  • 11

    自动化测试学习交流群:670250199

    2019年3月28日
  • 谢希明

    👍 👍 👍

    2019年1月31日