Nehmen Sie screenshot der gesamten Seite mit Selenium-Python mit chromedriver
Nach dem Versuch, verschiedene Ansätze... ich stolperte über diese Seite vollständig zu nutzen,-Seite screenshot mit chromedriver, Selen und python.
Den original-code ist hier. (und ich kopiere den code in diesem posting unten)
Verwendet es PIL und es funktioniert Super! Es gibt jedoch ein Problem... es fängt Feste überschriften und wiederholt für die gesamte Seite und findet auch einige Teile der Seite während Seite ändern. Beispiel-url für einen screenshot:
http://www.w3schools.com/js/default.asp
So vermeiden Sie die wiederholte Kopfzeilen mit diesem code... Oder gibt es eine bessere option, die verwendet python nur... ( ich weiß nicht, java und möchten nicht mit java).
Bitte sehen Sie sich den screenshot von der aktuellen Folge und Beispiel-code unten.
test.py
"""
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
- Ich bin dabei, einen screenshot von einer Seite, erfordert mehrere Schriftrollen/Nähen. Leider, es ist nicht eine öffentliche URL (man kann nur sehen, die Seite, wenn Sie eingeloggt sind). Wissen Sie, warum es hält, indem der header? res.cloudinary.com/mpyr-com/image/upload/v1551372542/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie erreichen dies durch ändern der CSS der header vor dem screenshot:
BEARBEITEN: Setzen Sie diese Zeile nach Ihrem Fenster scrollen:
Also in Ihrem util.py wird es sein:
Wenn die Website die
header
tag, Sie es tun können, mitfind_element_by_tag_name("header")
Dies funktioniert für mich. Es speichert die gesamte Seite als screenshot.
Für mehr Informationen, Lesen Sie bitte die api-docs:
http://selenium-python.readthedocs.io/api.html
Diese Antwort verbessert auf vorherigen Antworten durch am05mhz und Javed Karim.
Es wird davon ausgegangen headless-Modus, und das ein-Fenster-Größe-option wurde zunächst nicht festgelegt. Vor dem Aufruf dieser Funktion sicher die Seite vollständig geladen ist, vollständig oder ausreichend.
Er versucht, zum festlegen der Breite und Höhe sowohl, was notwendig ist. Der screenshot von der gesamten Seite kann manchmal auch einen unnötigen vertikalen Scrollbalken. Ein Weg, um in der Regel vermeiden Sie die Bildlaufleiste, indem Sie ein Bildschirmfoto des body-Elements statt. Nach dem speichern einen screenshot, es wird die Größe auf, was es ursprünglich war, widrigenfalls die Größe für den nächsten screenshot ist möglicherweise nicht richtig eingestellt.
Letztlich diese Technik kann immer noch nicht perfekt funktioniert gut für einige Beispiele.
Wenn mit Python älter als 3.6, entfernen Sie die Typ-Annotationen aus der definition einer Funktion.
required_height + 74
funktioniert bei mir jetzt.Screenshots sind beschränkt auf die viewport-aber Sie können dies umgehen, durch die Erfassung der
body
element, wie die webdriver erfassen das gesamte element, auch wenn es größer ist als der viewport. So sparen Sie mit viel scrollen und Nähen Bilder, allerdings sehen Sie möglicherweise Probleme mit footer-position (wie in der Abbildung unten).Getestet auf Windows 8 und Mac High Sierra mit Chrome-Treiber.
Gibt: (volle Größe: https://i.stack.imgur.com/ppDiI.png)
Nach Kenntnis der Ansatz von @Moshisho.
Mein standalone-arbeiten Skript, wird... (mehr-schlafen 0.2 nach jedem scrollen und position)
Ich änderte code für Python-3.6, vielleicht wird es hilfreich sein für jemanden:
Nicht sicher, ob die Menschen immer noch das Problem.
Ich habe ein kleinen hack, der funktioniert ziemlich gut und spielt schön mit den dynamischen Zonen. Hoffe es hilft
Warum nicht nur immer die Breite und Höhe der Seite, und ändern Sie dann die Größe der Treiber? So etwas wie dieses
Dies ist machen Sie einen screenshot der gesamten Seite, ohne die Notwendigkeit zu verschmelzen unterschiedliche Stücke.
Es wurde ein Fehler in der code, der zuvor in Zeile 2. Hier ist die korrigierte man. Ein noob hier, nicht in der Lage, zu Bearbeiten, meinen eigenen Beitrag noch.
Manchmal die baove nicht Holen Sie sich die besten Ergebnisse. So kann eine andere Methode verwenden, um die Höhe aller Elemente und die Summe zu stellen, um das capture-Höhe unten:
BTW, es funktioniert auf FF.
Etwas ändern @ihightower und @A. Minachev code, und in der mac-retina:
Habe ich geändert die jeremie-Initiative-s " Antwort, so dass es nur die url nur einmal.
default_width
oder was es war, oder sollte habe. Ich habe jetzt eine neuere Antwort, die behebt dieses Problem.Können Sie Splinter
Splinter ist eine Abstraktionsschicht auf der Oberseite des bestehenden browser-automation-tools wie Selen
Es ist ein neues feature
browser.screenshot(..., full=True)
in der neuen version0.10.0
.full=True
option full screen-capture für Sie.Habe es!!! funktioniert wie ein Charme
Für NodeJS, aber das Konzept ist das gleiche: