Python + Selenium操作一:截图详解


在做测试的时候,空口无凭都是白掐,特别是自动化测试的时候,更需要图片来佐证自己发现的问题

话不多说,直接进入主题,技术就是这么直白

Webdriver自带截图功能,get_screenshot_as_file(),save_screenshot(),使用起来还是蛮方便的

截图一:get_screenshot_as_file()

截图二:save_screenshot()

get_screenshot_as_file()方式

该方式很简单,通过driver获取该方法,将截图要保存的路径写入就好,先看一张图,没运行代码的时候,Picture目录下还没有名为baidu.png的图片,建个Picture目录,是为了方便管理截图的图片

接下来运行代码,保存的图片如下:

可以看到,图片是截图成功了的,在对应文件夹下也是可以看到图片的,代码如下:

# coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
try:
    picture_url=driver.get_screenshot_as_file('G:\\201801-\\python_code\\Demo\\Picture\\baidu.png')
    print("%s:截图成功!!!" % picture_url)
except BaseException as msg:
    print(msg)
driver.quit()

这里需要注意的是,文件存放的路径一定要正确,路径中的\\双斜杠,有一个是转义符,这个就不多说了

这种方式写法太过于死板,这样运行下去,图片名字会重名,达不到什么好效果,可以生成代码运行的当前时间,来做为图片名,这样就不会再出现该问题了,修改代码如下:

# coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
print(picture_time)
try:
    picture_url=driver.get_screenshot_as_file('G:\\201801-\\python_code\\Demo\\Picture\\'+ picture_time +'.png')
    print("%s:截图成功!!!" % picture_url)
except BaseException as msg:
    print(msg)
driver.quit()

代码运行后,查看截图的效果,如下:

该方法使用起来更加方便,算是一个小小优化

save_screenshot()方式

save_screenshot()与get_screenshot_as_file()方式都是一样,先看一个小例子,代码如下:

# 截图方式二
# coding=utf-8
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
try:
    picture_url=driver.save_screenshot('.\\baidu1.png')
    print("%s :截图成功!!!" % picture_url)
except BaseException as msg:
    print("%s :截图失败!!!" % msg)
driver.quit()

运行该代码后,在当前目录下会保存成功一张名为baidu1.png的图片,如下:

一种方式学会,另一种是不是很简单了,接下来以这种截图方式,来做个优化吧,先看代码:

# 截图方式二
# coding=utf-8
from selenium import webdriver
import os
import time
# 生成年月日时分秒时间
picture_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
directory_time = time.strftime("%Y-%m-%d", time.localtime(time.time()))
print(picture_time)
print(directory_time)
# 打印文件目录
print(os.getcwd())
# 获取到当前文件的目录,并检查是否有 directory_time 文件夹,如果不存在则自动新建 directory_time 文件
try:
    File_Path = os.getcwd() + '\\' + directory_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 = webdriver.Chrome()
driver.get("https://baidu.com/")
try:
    url=driver.save_screenshot('.\\' + directory_time + '\\' + picture_time + '.png')
    print("%s :截图成功!!!" % url)
except BaseException as pic_msg:
    print("截图失败:%s" % pic_msg)
time.sleep(2)
driver.quit()

 该代码的优化,是自动创建日期目录,并将截取的图片以年月日时分秒命名保存在当前日期目录下,这样就能很方便的查看图片保存路径,也方便管理自己的测试图片

 运行代码,我们来查看结果,如下:

这样运行代码后,就自动生成了名为2018-09-16的文件夹,截取的图片命名为2018-09-16-16_14_18.png,并保存在2018-09-16的文件夹下,如果明天运行该代码,就会生成新的文件夹,并命名为2018-09-17,这样就很好的区分了图片日期来源,如果再次运行该代码,就会提示文件夹已存在,图片依然截取成功,如下:

好了,这就是今天的截图内容了,还有可优化的地方,比如,截取指定大小的图片,截取元素的图片,如果页面很长,单单使用该两种方式是截取不全的,这就需要使用JS的配合了。今天所述内容,有误的地方,希望大家及时指出,我也及时改正。

学习的一点心得,大家都知道,遇到问题,不要逃避,更不要慌张,慢慢来,沉下心来,多度娘,多看博客,终究会解决的。今天在使用第二种方式优化代码截图的时候,由于没有新建目录的那一步,所以一直截图不成功,后面灵机一动,先给创建一个目录,再运行代码,结果就截图成功了,有点小喜悦。