selenium + python实现截图并且保存图片的方法

在自动化测试过程中,是有必要截图的,特别是遇到错误的时候进行截图,截图可以帮助我们直观的定位错误、记录测试步骤。。截图对于测试人员来说应该是较为重要的一个技能。

webdriver的截图功能十分强悍,无论页面多长,webdriver都能比较完美的截到完整的页面。

Webdriver自带截图功能:

(1)get_screenshot_as_file()

该方式很简单,通过driver获取该方法,将截图要保存的路径写入就好,

(2)save_screenshot(),与get_screenshot_as_file()方式一样,使用起来都很简单

看以下实例,打开csdn首页进行截图

# -*- coding: utf-8 -*-
from selenium import webdriver
import unittest
import os,sys,time
from pathlib import Path

#初始化实例
driver = webdriver.Chrome()

current_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
current_time1 = time.strftime("%Y-%m-%d", time.localtime(time.time()))
print(current_time )
print(current_time1 )

#设置存储图片路径,测试结果图片可以按照每天进行区分

#通过if进行断言判断
driver.get("https://www.csdn.net/")
#新创建路径“.”表示当前整个.py文件的路径所在的位置,“\\”路径分割符,其中的一个是"\"转义符
pfilename = u'.\\image'
pic_path = pfilename+ '\\' + current_time1 + '_' + current_time + '.png'
#判断文件夹是否存在,不存在就新建一个新的
if Path(pfilename).is_dir():
    pass
else:
    Path(pfilename).mkdir()

print(pic_path)
time.sleep(2)
print(driver.title)
#截取当前url页面的图片,并且将截取的图片保存在指定的路径(pic_path)
driver.save_screenshot(pic_path)

if u'CSDN-专业IT技术社区' == driver.title:
    print('Assertion test pass')
else:
    print('Assertion test fail')

driver.quit()

运行的结果如下

selenium + python实现截图并且保存图片的方法_第1张图片

2、解决打开一个网站,出现的图片加载不完全的问题。好在selenium支持javascript,我们可以在截图之前先运行一个javascript脚本,先滚动页面的滚动条,然后再回到顶部再去截图。

#-*- coding:utf-8 -*-
from selenium import webdriver
import time
from pathlib import Path

def take_screenshot(url):
    browser = webdriver.Chrome()
    browser.maximize_window()
    browser.get(url) # Load page
    browser.execute_script("""
        (function () {
            var y = 0;
            var step = 100;
            window.scroll(0, 0);

            function f() {
                if (y < document.body.scrollHeight) {
                    y += step;
                    window.scroll(0, y);
                    setTimeout(f, 100);
                } else {
                    window.scroll(0, 0);
                    document.title += "scroll-done";
                }
            }

            setTimeout(f, 1000);
        })();
    """)

    for i in xrange(30):
        if "scroll-done" in browser.title:
            break
        time.sleep(10)

    current_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
    #新创建路径“.”表示当前整个.py文件的路径所在的位置,“\\”路径分割符,其中的一个是"\"转义符
    pfilename = u'.\\image'
    pic_path = pfilename+ '\\' + current_time + '.png'
    #判断文件夹是否存在,不存在就新建一个新的
    if Path(pfilename).is_dir():
        pass
    else:
        Path(pfilename).mkdir()

    print(pic_path)
    time.sleep(2)


    browser.save_screenshot(pic_path)
    browser.close()


if __name__ == "__main__":

    take_screenshot("http://codingpy.com")

3、截取页面的某个元素实现方法:

(1)先去截图一张全屏大图

(2)再定位元素,获取其地址和宽高,进行截取

#-*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time
from PIL import Image

#实现思路
#1、截取元素位置、大小
#2、获取元素位置、大小
#3、截取元素图片并保存

#时间格式进行格式化
def time_format():
    current_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
    return current_time

#区域截图(对指定的区域/元素截图)
def element_screenshot(element):
    #截取全屏图片
    driver.save_screenshot(".\\image\\full.png")
    #获取element的顶点坐标
    x_Piont = element.location['x']
    y_Piont = element.location['y']
    #获取element的宽、高
    element_width = x_Piont + element.size['width']
    element_height = y_Piont + element.size['height']

    picture = Image.open(".\\image\\full.png")

    picture = picture.crop((x_Piont, y_Piont, element_width, element_height))

    '''
    去掉截图下端的空白区域
    '''
    driver.execute_script(
        """
        $('#main').siblings().remove();
        $('#aside__wrapper').siblings().remove();
        $('.ui.sticky').siblings().remove();
        $('.follow-me').siblings().remove();
        $('img.ui.image').siblings().remove();
        """
    )

    picture.save(".\\image" + time_format() + ".png")

    
driver = webdriver.Chrome()
driver.get("http://www.baidu.com/")
driver.maximize_window()

#要截取的目标元素
element = driver.find_element_by_id("su")
#调用element_screenshot()方法
element_screenshot(element)

sleep(2)
driver.quit()

4、截取长图的方法。百度上很多教程有说到使用WebDriver.PhantomJS自带的方法支持对整个网页截屏,但是新版的selenium已经去掉了PhantomJS,也有一个解决方案,但是并没有实现截取长图,下面的代码找到了替代PhantomJS的方案,但是运行起来没有截取长图,具体原因还有待研究。

#-*- coding:utf-8 -*-
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from pathlib import Path

def take_screenshot(url):
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    browser = webdriver.Chrome(executable_path='C:\\Python27\\chromedriver', chrome_options=chrome_options)
    browser.maximize_window()
    browser.get(url) # Load page

    current_time = time.strftime("%Y-%m-%d-%H_%M_%S", time.localtime(time.time()))
    #新创建路径“.”表示当前整个.py文件的路径所在的位置,“\\”路径分割符,其中的一个是"\"转义符
    pfilename = u'.\\image'
    pic_path = pfilename+ '\\' + current_time + '.png'
    #判断文件夹是否存在,不存在就新建一个新的
    if Path(pfilename).is_dir():
        pass
    else:
        Path(pfilename).mkdir()

    print(pic_path)
    time.sleep(2)


    browser.save_screenshot(pic_path)
    browser.close()


if __name__ == "__main__":

    take_screenshot("http://codingpy.com")

 

你可能感兴趣的:(selenium,python,unittest)