使用selenium進(jìn)行網(wǎng)頁截圖,本文使用方法皆為顯式情境下調(diào)試,未涉及隱式(無界面)與協(xié)議(設(shè)備模擬)。
首先定義驅(qū)動driver
from selenium import webdriver
driver = webdriver.Chrome()
#可指定目標(biāo)頁面網(wǎng)址,不指定頁面默認(rèn)為空白頁
#url1='???'
#driver.get(url1)
拼接圖片涉及
from PIL import Image
import numpy as np
一、基本操作
首先是最基礎(chǔ)的截圖,界面截圖與某一部件截圖
#部件截圖
driver.find_element_by_id('captchaimg').screenshot('C:/xxxx/xx.png')
#屏幕截圖
driver.get_screenshot_as_file('C:/xxxx/xx.png')
二、整頁截圖
以上方法只能截取當(dāng)前頁面的圖片,那么當(dāng)網(wǎng)頁長度超出屏幕長度時呢?(即需要滾動)
2.1截取再拼接
window_height = self.driver.execute_script("return window.screen.height") #屏幕高度
self.driver.set_window_size(650, window_height) #設(shè)置瀏覽器寬高
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))) # 打開截圖并轉(zhuǎn)為二維矩陣
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進(jìn)行打印截圖
# 打開谷歌瀏覽器
chrome_options = webdriver.ChromeOptions()
settings = {
"recentDestinations": [{
"id": "Save as PDF",
"origin": "local",
"account": ""
}],
"selectedDestinationId": "Save as PDF",
"version": 2, # 另存為pdf,1 是默認(rèn)打印機
"isHeaderFooterEnabled": True, # 是否勾選頁眉和頁腳
# "customMargins": {},
# "marginsType": 2,#邊距(2是最小值、0是默認(rèn))
# "scaling": 100,
# "scalingType": 3,
# "scalingTypePdf": 3,
# "isLandscapeEnabled": True, # 若不設(shè)置該參數(shù),默認(rèn)值為縱向
"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模式下,瀏覽器窗口不可見,應(yīng)當(dāng)可提高效率
prefs = {
'printing.print_preview_sticky_settings.appState': json.dumps(settings),
'savefile.default_directory': r'{}'.format(self.path_last) # 此處填寫你希望文件保存的路徑,可填寫your file path默認(rèn)下載地址
}
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修改網(wǎng)頁的title,該title最終就是PDF文件名,利用js的window.print可以快速調(diào)出瀏覽器打印窗口,避免使用熱鍵ctrl+P
三、某部件長截圖
在網(wǎng)頁中,或許存在某一部件,該部件采取滾動條的形式(即需要滾動該部件進(jìn)行截屏)文章來源:http://www.zghlxwxcb.cn/news/detail-511511.html
同理,使用單位置截屏滾動再拼接的方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-511511.html
tabe = self.driver.find_element_by_xpath('sdasd')
tr0 = tabe.find_elements_by_xpath('tbody')[0] #找到位置
#我這里是有多行tr,故統(tǒng)計tr數(shù)量
tr0 = tr0.find_elements_by_xpath('tr')
self.driver.set_window_size(1350,650) #調(diào)整瀏覽器尺寸,也可以直接打印部件
n1 = (len(tr0)-1)//5 #5是我同窗可顯示數(shù)目
if n1==0: #展示數(shù)量小于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)) # 截屏,替換最后一張
#若需要拼接,需要注意第一張圖片在循環(huán)之外打開(以它為底)
#拼接部分
# 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))) # 打開截圖并轉(zhuǎn)為二維矩陣
# base_mat = np.append(base_mat, mat, axis=0) # 拼接圖片的二維矩陣
# Image.fromarray(base_mat).save(os.path.join(self.path1,'521.png'))
到了這里,關(guān)于selenium進(jìn)行網(wǎng)頁長截圖,模塊長截圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!