Python 中的 Webdriver 屏幕截图

问题描述 投票:0回答:15

在windows上使用python使用Selenium Webdriver截图时,截图直接保存到程序的路径下,有没有办法将.png文件保存到特定目录?

python selenium-webdriver webdriver screenshot webpage-screenshot
15个回答
88
投票

使用

driver.save_screenshot('/path/to/file')
driver.get_screenshot_as_file('/path/to/file')
:

import selenium.webdriver as webdriver
import contextlib

@contextlib.contextmanager
def quitting(thing):
    yield thing
    thing.quit()

with quitting(webdriver.Firefox()) as driver:
    driver.implicitly_wait(10)
    driver.get('http://www.google.com')
    driver.get_screenshot_as_file('/tmp/google.png') 
    # driver.save_screenshot('/tmp/google.png')

35
投票

受到此线程的启发(对于 Java 也是同样的问题):使用 Selenium WebDriver 进行屏幕截图

from selenium import webdriver

browser = webdriver.Firefox()
browser.get('http://www.google.com/')
browser.save_screenshot('screenie.png')
browser.quit()

10
投票

是的,我们有办法使用 python webdriver 获取 .png 的屏幕截图扩展名

如果您使用 python webriver,请使用下面的代码。它非常简单。

driver.save_screenshot('D\folder\filename.png')

7
投票
driver.save_screenshot("path to save \\screen.jpeg")

7
投票

这将截取屏幕截图并将其放置在所选名称的目录中。

import os
driver.save_screenshot(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'NameOfScreenShotDirectory', 'PutFileNameHere'))

5
投票

当然现在这不是真的,但我也遇到了这个问题和我的方式: 看起来“save_screenshot”在创建名称中带有空格的文件时遇到了一些麻烦,同时我向文件名添加了随机化以转义覆盖。

这里我有方法来清除文件名中的空格(如何用下划线替换空格,反之亦然?):

def urlify(self, s):
    # Remove all non-word characters (everything except numbers and letters)
    s = re.sub(r"[^\w\s]", '', s)
    # Replace all runs of whitespace with a single dash
    s = re.sub(r"\s+", '-', s)
    return s

然后

driver.save_screenshot('c:\\pytest_screenshots\\%s' % screen_name)

哪里

def datetime_now(prefix):
    symbols = str(datetime.datetime.now())
    return prefix + "-" + "".join(symbols)

screen_name = self.urlify(datetime_now('screen')) + '.png'

5
投票

这里他们问了类似的问题,答案似乎更完整,我留下来源:

如何在Python中使用Selenium WebDriver截取部分屏幕截图?

from selenium import webdriver
from PIL import Image
from io import BytesIO

fox = webdriver.Firefox()
fox.get('http://stackoverflow.com/')

# now that we have the preliminary stuff out of the way time to get that image :D
element = fox.find_element_by_id('hlogo') # find part of the page you want image of
location = element.location
size = element.size
png = fox.get_screenshot_as_png() # saves screenshot of entire page
fox.quit()

im = Image.open(BytesIO(png)) # uses PIL library to open image in memory

left = location['x']
top = location['y']
right = location['x'] + size['width']
bottom = location['y'] + size['height']


im = im.crop((left, top, right, bottom)) # defines crop points
im.save('screenshot.png') # saves new cropped image

3
投票

您可以使用以下函数作为相对路径,因为在脚本中添加绝对路径不是一个好主意

导入

import sys, os

使用如下代码:

ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
screenshotpath = os.path.join(os.path.sep, ROOT_DIR,'Screenshots'+ os.sep)
driver.get_screenshot_as_file(screenshotpath+"testPngFunction.png")

确保创建 .py 文件所在的文件夹。

os.path.join
还会阻止您在跨平台(例如 UNIX 和 Windows)中运行脚本。它将在运行时根据操作系统生成路径分隔符。
os.sep
类似于java中的
File.separtor


2
投票
TakeScreenShot screenshot=new TakeScreenShot();
screenshot.screenShot("screenshots//TestScreenshot//password.png");

一定会成功的,请尝试。


0
投票

看看下面的Python脚本,使用Chrome的seleniumweb driver来拍摄FB主页。

脚本:

import selenium

from selenium import webdriver

import time

from time import sleep

chrome_browser = webdriver.Chrome()

chrome_browser.get('https://www.facebook.com/') # Enter to FB login page

sleep(5)

chrome_browser.save_screenshot('C:/Users/user/Desktop/demo.png') # To take FB homepage snap

chrome_browser.close() # To Close the driver connection

chrome_browser.quit() # To Close the browser

0
投票

这很简单,请尝试一下:

from selenium import webdriver

driver = webdriver.Chrome()

def take_screenshot(name):
    driver.get_screenshot_as_file(f"./screenshot/{name}.png")

#Or with datetime:
def take_screenshot_with_dt(name):       
    datetime.now()
    screenDatetime = datetime.now().strftime('%d-%m-%Y-%H-%M')
    driver.get_screenshot_as_file(f"./screenshot/{name}-{screenDatetime}.png")



take_screenshot("screenshotName")
take_screenshot_with_dt("screenshotNameDt")

0
投票

将此钩子写在

conftest.py

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item):
    pytest_html = item.config.pluginmanager.getplugin("html")
    outcome = yield
    report = outcome.get_result()
    extra = getattr(report, "extra", [])
    if report.when == "call":
        # always add url to report
        extra.append(pytest_html.extras.url(driver.current_url))
        xfail = hasattr(report, "wasxfail")
        if (report.skipped and xfail) or (report.failed and not xfail):
            report_directory = os.path.dirname(item.config.option.htmlpath)
            file_name = report.nodeid.replace("::", "_") + ".png"
            destination_file = os.path.join(report_directory, file_name)
            driver.save_screenshot(destination_file)
            if file_name:
                html = '<div><img src="%s" alt="screenshot" style="width:300px;height=200px"'\
                    'onclick="window.open(this.src)" align="right"/></div>'%file_name
            # only add additional html on failure
                extra.append(pytest_html.extras.html(html))
        report.extra = extra

0
投票

在 Django 中,您可以在无头 Google Chrome、Microsoft Edge 和 Firefox 上截取 Django Admin 的屏幕截图,如下所示。 *我使用 pytest-djangoselenium我的回答解释了如何在无头浏览器上一起执行此操作:

<谷歌浏览器>

import pytest
from selenium import webdriver

def take_screenshot(driver, name):
    os.makedirs(os.path.join("screenshot", os.path.dirname(name)), exist_ok=True)
    driver.save_screenshot(os.path.join("screenshot", name))

def test_1(live_server):
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")
    driver = webdriver.Chrome(options=options)
    driver.set_window_size(1024, 768)
    driver.get(("%s%s" % (live_server.url, "/admin/")))
    take_screenshot(driver, "admin/chrome.png")
    assert "Log in | Django site admin" in driver.title

<Microsoft Edge>

import pytest
from selenium import webdriver

def take_screenshot(driver, name):
    os.makedirs(os.path.join("screenshot", os.path.dirname(name)), exist_ok=True)
    driver.save_screenshot(os.path.join("screenshot", name))

def test_1(live_server):
    options = webdriver.EdgeOptions()
    options.add_argument("--headless=new")
    driver = webdriver.Edge(options=options)
    driver.set_window_size(1024, 768)
    driver.get(("%s%s" % (live_server.url, "/admin/")))
    take_screenshot(driver, "admin/edge.png")
    assert "Log in | Django site admin" in driver.title

<火狐>

import pytest
from selenium import webdriver

def take_screenshot(driver, name):
    os.makedirs(os.path.join("screenshot", os.path.dirname(name)), exist_ok=True)
    driver.save_screenshot(os.path.join("screenshot", name))

def test_1(live_server):
    options = webdriver.FirefoxOptions()
    options.add_argument("-headless")
    driver = webdriver.Firefox(options=options)
    driver.set_window_size(1024, 768)
    driver.get(("%s%s" % (live_server.url, "/admin/")))
    take_screenshot(driver, "admin/firefox.png")
    assert "Log in | Django site admin" in driver.title

-2
投票
WebDriver driver = new FirefoxDriver();
driver.get("http://www.google.com/");
File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(scrFile, new File("c:\\NewFolder\\screenshot1.jpg"));

-10
投票

我知道你正在寻找 python 中的答案,但这里是如何在 ruby 中做到这一点..

http://watirwebdriver.com/screenshots/

如果这只能通过保存在当前目录中来实现。我会首先将图像分配给一个变量,然后将该变量作为 PNG 文件保存到磁盘。

例如:

 image = b.screenshot.png

 File.open("testfile.png", "w") do |file|
  file.puts "#{image}"
 end

其中 b 是 webdriver 使用的浏览器变量。我可以灵活地在“File.open”中提供绝对或相对路径,这样我就可以将图像保存在任何地方。

© www.soinside.com 2019 - 2024. All rights reserved.