使用selenium进行网页截图,本文使用方法皆为显式情境下调试,未涉及隐式(无界面)与协议(设备模拟)。
首先定义驱动driver
from selenium import webdriver
driver = webdriver.Chrome()
#可指定目标页面网址,不指定页面默认为空白页
#url1='???'
#driver.get(url1)
拼接图片涉及
from PIL import Image
import numpy as np
一、基本操作
首先是最基础的截图,界面截图与某一部件截图
#部件截图
driver.find_element_by_id('captchaimg').screenshot('C:/xxxx/xx.png')
#屏幕截图
driver.get_screenshot_as_file('C:/xxxx/xx.png')
二、整页截图
以上方法只能截取当前页面的图片,那么当网页长度超出屏幕长度时呢?(即需要滚动)
2.1截取再拼接
window_height = self.driver.execute_script("return window.screen.height") #屏幕高度
self.driver.set_window_size(650, window_height) #设置浏览器宽高
time.sleep(1)
page_height = self.driver.execute_script('return document.documentElement.scrollHeight') # 页面高度
print(window_height, page_height)
n1 = page_height// window_height
if n1 == 0: #判断是否需要滚动
self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path_last,Account_number )) #指定截图保存位置
else:
self.driver.set_window_size(650, window_height)
for j in range(n1+1):
self.driver.execute_script("window.scrollBy(0,{})".format(j*window_height))
time.sleep(0.5)
#driver.find_element(By.ID,'frmRecPODetail').screenshot(r'.png'.format(i)) #只截取部分
self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path_mid, j)) # 截屏
#拼图时间到
target_img=os.listdir(self.path_mid)
base_mat = np.atleast_2d(Image.open(os.path.join(self.path_mid,target_img[0])))
for i in target_img[1:]:
mat = np.atleast_2d(Image.open(os.path.join(self.path_mid,i))) # 打开截图并转为二维矩阵
base_mat = np.append(base_mat, mat, axis=0) # 拼接图片的二维矩阵
Image.fromarray(base_mat).save(os.path.join(self.path_last,'{}.png'.format(Account_number)))
2.2利用javascript进行打印截图
# 打开谷歌浏览器
chrome_options = webdriver.ChromeOptions()
settings = {
"recentDestinations": [{
"id": "Save as PDF",
"origin": "local",
"account": ""
}],
"selectedDestinationId": "Save as PDF",
"version": 2, # 另存为pdf,1 是默认打印机
"isHeaderFooterEnabled": True, # 是否勾选页眉和页脚
# "customMargins": {},
# "marginsType": 2,#边距(2是最小值、0是默认)
# "scaling": 100,
# "scalingType": 3,
# "scalingTypePdf": 3,
# "isLandscapeEnabled": True, # 若不设置该参数,默认值为纵向
"isCssBackgroundEnabled": True,
"mediaSize": {
"height_microns": 297000,
"name": "ISO_A4",
"width_microns": 210000,
"custom_display_name": "A4"
},
}
chrome_options.add_argument('--enable-print-browser')
# chrome_options.add_argument('--headless') #headless模式下,浏览器窗口不可见,应当可提高效率
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(settings),
'savefile.default_directory': r'{}'.format(self.path_last) # 此处填写你希望文件保存的路径,可填写your file path默认下载地址
}
chrome_options.add_argument('--kiosk-printing') # 静默打印,无需用户点击打印页面的确定按钮
chrome_options.add_experimental_option('prefs', prefs)
self.driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=self.path_dri)
self.driver.execute_script(
'document.title="{}.pdf";window.print();'.format(Account_number)) # 利用js修改网页的title,该title最终就是PDF文件名,利用js的window.print可以快速调出浏览器打印窗口,避免使用热键ctrl+P
三、某部件长截图
在网页中,或许存在某一部件,该部件采取滚动条的形式(即需要滚动该部件进行截屏)
同理,使用单位置截屏滚动再拼接的方法。
tabe = self.driver.find_element_by_xpath('sdasd')
tr0 = tabe.find_elements_by_xpath('tbody')[0] #找到位置
#我这里是有多行tr,故统计tr数量
tr0 = tr0.find_elements_by_xpath('tr')
self.driver.set_window_size(1350,650) #调整浏览器尺寸,也可以直接打印部件
n1 = (len(tr0)-1)//5 #5是我同窗可显示数目
if n1==0: #展示数量小于5,无需滚动
self.pic += 1
self.driver.execute_script('document.documentElement.scrollTop=10000')
self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,'0'))
else:
for i in range(n1+1):
self.driver.execute_script("arguments[0].scrollIntoView(false)",tr0[i*5])
self.driver.execute_script('document.documentElement.scrollTop=10000')
# driver.find_element(By.ID,'frmRecPODetail').screenshot(r'C:\xx\{}.png'.format(i)) #只截取部分
self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,i)) # 截屏
self.pic+=1
else:
if (len(tr0)-1)%5!=0:
self.driver.execute_script("arguments[0].scrollIntoView(false)",tr0[i*5+(len(tr0)-1)%5])
self.driver.execute_script('document.documentElement.scrollTop=10000') # 将页面滚动到底部
# driver.find_element(By.ID,'frmRecPODetail').screenshot(r'C:\xx\{}.png'.format(i+1))
self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,i+1)) # 截屏
self.pic += 1
else:
self.driver.execute_script('document.documentElement.scrollTop=10000') # 将页面滚动到底部
self.driver.get_screenshot_as_file(r'{}\{}.png'.format(self.path1,i)) # 截屏,替换最后一张
#若需要拼接,需要注意第一张图片在循环之外打开(以它为底)
#拼接部分
# target_img=os.listdir(self.path3)
# base_mat = np.atleast_2d(Image.open(os.path.join(self.path3,target_img[0])))
# for i in target_img[1:]:
# mat = np.atleast_2d(Image.open(os.path.join(self.path3,i))) # 打开截图并转为二维矩阵
# base_mat = np.append(base_mat, mat, axis=0) # 拼接图片的二维矩阵
# Image.fromarray(base_mat).save(os.path.join(self.path1,'521.png'))
版权归原作者 精英干员瑕光 所有, 如有侵权,请联系我们删除。