在尝试了各种方法之后...我偶然发现了这个页面,用chromedriver、selenium和Python进行了全页截图。
原始代码在这里。(我在下面的帖子中复制了代码)
它使用PIL,它的工作很好!然而,有一个问题...也就是说,它捕获固定的标题和整个页面的重复,并且在页面更改期间遗漏页面的某些部分。获取截图的示例url:
"""
This script uses a simplified version of the one here:
https://snipt.net/restrada/python-selenium-workaround-for-full-page-screenshot-using-chromedriver-2x/
It contains the *crucial* correction added in the comments by Jason Coutu.
"""
import sys
from selenium import webdriver
import unittest
import util
class Test(unittest.TestCase):
""" Demonstration: Get Chrome to generate fullscreen screenshot """
def setUp(self):
self.driver = webdriver.Chrome()
def tearDown(self):
self.driver.quit()
def test_fullpage_screenshot(self):
''' Generate document-height screenshot '''
#url = "http://effbot.org/imagingbook/introduction.htm"
url = "http://www.w3schools.com/js/default.asp"
self.driver.get(url)
util.fullpage_screenshot(self.driver, "test.png")
if __name__ == "__main__":
unittest.main(argv=[sys.argv[0]])
Util.Py
import os
import time
from PIL import Image
def fullpage_screenshot(driver, file):
print("Starting chrome full page screenshot workaround ...")
total_width = driver.execute_script("return document.body.offsetWidth")
total_height = driver.execute_script("return document.body.parentNode.scrollHeight")
viewport_width = driver.execute_script("return document.body.clientWidth")
viewport_height = driver.execute_script("return window.innerHeight")
print("Total: ({0}, {1}), Viewport: ({2},{3})".format(total_width, total_height,viewport_width,viewport_height))
rectangles = []
i = 0
while i < total_height:
ii = 0
top_height = i + viewport_height
if top_height > total_height:
top_height = total_height
while ii < total_width:
top_width = ii + viewport_width
if top_width > total_width:
top_width = total_width
print("Appending rectangle ({0},{1},{2},{3})".format(ii, i, top_width, top_height))
rectangles.append((ii, i, top_width,top_height))
ii = ii + viewport_width
i = i + viewport_height
stitched_image = Image.new('RGB', (total_width, total_height))
previous = None
part = 0
for rectangle in rectangles:
if not previous is None:
driver.execute_script("window.scrollTo({0}, {1})".format(rectangle[0], rectangle[1]))
print("Scrolled To ({0},{1})".format(rectangle[0], rectangle[1]))
time.sleep(0.2)
file_name = "part_{0}.png".format(part)
print("Capturing {0} ...".format(file_name))
driver.get_screenshot_as_file(file_name)
screenshot = Image.open(file_name)
if rectangle[1] + viewport_height > total_height:
offset = (rectangle[0], total_height - viewport_height)
else:
offset = (rectangle[0], rectangle[1])
print("Adding to stitched image with offset ({0}, {1})".format(offset[0],offset[1]))
stitched_image.paste(screenshot, offset)
del screenshot
os.remove(file_name)
part = part + 1
previous = rectangle
stitched_image.save(file)
print("Finishing chrome full page screenshot workaround...")
return True
topnav = driver.find_element_by_id("topnav")
driver.execute_script("arguments[0].setAttribute('style', 'position: absolute; top: 0px;')", topnav)
driver.execute_script("document.getElementById('topnav').setAttribute('style', 'position: absolute; top: 0px;');")
driver.execute_script("window.scrollTo({0}, {1})".format(rectangle[0], rectangle[1]))
driver.execute_script("document.getElementById('topnav').setAttribute('style', 'position: absolute; top: 0px;');")
如果站点使用header
标记,则可以使用find_element_by_tag_name(“header”)
我知道这在以前是不可能的,但现在有了以下更新: 现在有可能在Java中使用Selenium吗?
我正试图使用selenium和chromedriver进行全页截图,但我得到的是这一半截图。我尝试过其他方法,但到目前为止,只有这一个工作,它只需要半页截图。 任何人都可以用另一个技巧来修复这个问题,也可以附加输出结果。
我在VPS的Xvfb上运行火狐。我想做的是对页面进行全页截图。 我可以使用以下方法将Firefox重定向到特定页面 并使用ImageMagick进行屏幕截图(在X内部) 问题是,大部分页面需要滚动,我无法事先知道高度。 另一种方法是挑一个非常大的高度(像4000px)然后对图像进行处理,去掉无用的部分。但那是不必要的处理。 我发现了许多Firefox插件,但我正在寻找一个可以使用Shell命令行编
这篇帖子和这篇有关: Python selenium屏幕捕获未获取整个页面 但这似乎不是一个通用的解决方案,它要复杂得多。)
问题内容: 我添加到我的环境变量 我在这里下载的http://selenium- release.storage.googleapis.com/index.html?path=2.46/ Python脚本: 输出: 我期望jar定义了所有内容,为什么找不到驱动程序类? 问题答案: 根据您的问题,您似乎正在使用适用于Opera 12及更高版本的旧驱动程序。假设您尝试使用最新版本的Opera,则需要使
问题内容: 是否可以使用JavaScript截取网页的屏幕截图,然后将其提交回服务器? 我不太担心浏览器的安全性问题。等,因为实施将针对HTA。但是有可能吗? 问题答案: 我已经通过使用ActiveX控件为HTA完成了此操作。在VB6中构建控件以截取屏幕截图非常容易。我必须使用keybd_event API调用,因为SendKeys无法执行PrintScreen。这是该代码: 这只会使您到达将窗口