实际使用过程中,截图一般的使用场景:全屏截图、区域截图(截取指定的区域)
场景一、全屏截图
直接使用selenium的get_screenshot_as_file就可以实现
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time
# 时间格式进行格式化
def time_format():
current_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
return current_time
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
driver.get_screenshot_as_file("截图\\"+time_format()+".png")
sleep(2)
driver.quit()
实现思路:
1.截取全屏图片并保存
2.获取元素位置、大小
3.裁取元素图片并保存
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time
from PIL import Image
# 时间格式进行格式化
def time_format():
current_time = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
return current_time
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
# 截取全屏
driver.save_screenshot("截图\\full.png")
# 要截屏的目标元素
element = driver.find_element_by_id("su")
print(element.location)
print(element.size)
# 获取element的顶点坐标
xPiont = element.location['x']
yPiont = element.location['y']
# 获取element的宽、高
element_width = xPiont + element.size['width']
element_height = yPiont + element.size['height']
picture = Image.open('截图\\full.png')
'''
crop()-- 一个显式的参数:一个4元组
Image.crop(box=None):图像返回一个矩形区域,box是一个四元组 限定所述左,上,右,和下像素坐标
参数:box--裁剪矩形,作为(左,上,右,下)-tuple;返回类型:Image;返回:一个Image对象
所以你应该重写它:
img.crop((414,122,650,338))
# ^ 4-tuple ^
'''
picture = picture.crop((xPiont, yPiont, element_width, element_height))
picture.save("截图\\"+time_format()+".png")
sleep(2)
driver.quit()
运行结果:
Note:如果把截取元素图片的代码单独拿出来封装,截图的图片下方会出现空白区域:
# -*- coding:utf-8 -*-
from selenium import webdriver
from time import sleep
import time
from PIL import Image
# 时间格式进行格式化
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("截图\\full.png")
# 获取element的顶点坐标
x_piont = element.location['x']
y_piont = element.location['y']
# 获取element的宽、高
element_width = x_piont + element.size['width']
element_height = x_piont + element.size['height']
# 开始截取指定区域
picture = Image.open("截图\\full.png")
'''
crop()-- 一个显式的参数:一个4元组
Image.crop(box=None):图像返回一个矩形区域,box是一个四元组 限定所述左,上,右,和下像素坐标
参数:box--裁剪矩形,作为(左,上,右,下)-tuple;返回类型:Image;返回:一个Image对象
所以你应该重写它:
img.crop((414,122,650,338))
# ^ 4-tuple ^
'''
picture = picture.crop((x_piont, y_piont, element_width, element_height))
picture.save("截图\\"+time_format()+".png")
driver = webdriver.Chrome()
driver.get('http://www.baidu.com/')
# 要截屏的目标元素
element = driver.find_element_by_id("su")
# 调用element_screenshot()方法
element_screenshot(element)
sleep(2)
driver.quit()
运行结果:
运行结果如上图所示,在图片的下边会出现空白区域,并不是我们期望得到的结果,需要去掉图片下边的空白区域,在代码中加入如下js即可:
'''
去掉截图下端的空白区域
'''
driver.execute_script(
"""
$('#main').siblings().remove();
$('#aside__wrapper').siblings().remove();
$('.ui.sticky').siblings().remove();
$('.follow-me').siblings().remove();
$('img.ui.image').siblings().remove();
"""
)