Webdriver 截图

Posted

技术标签:

【中文标题】Webdriver 截图【英文标题】:Webdriver Screenshot 【发布时间】:2012-02-12 13:53:00 【问题描述】:

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

【问题讨论】:

【参考方案1】:

查看下面的 python 脚本,使用 Chrome web 驱动程序selenium 包拍摄 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

【讨论】:

【参考方案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"));

【讨论】:

请提供一些解释以配合您的代码。【参考方案3】:
TakeScreenShot screenshot=new TakeScreenShot();
screenshot.screenShot("screenshots//TestScreenshot//password.png");

它会起作用的,请尝试。

【讨论】:

【参考方案4】:

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

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

【讨论】:

为答案提供格式良好的代码非常棒,但通常最好的做法是在其中包含一些解释。 "这将截取屏幕截图并将其放置在所选名称的目录中。"对于我想象的大多数人来说,这很清楚 NameError: name 'file' 没有定义【参考方案5】:

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

How to take partial screenshot with Selenium WebDriver in python?

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

fox = webdriver.Firefox()
fox.get('http://***.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

【讨论】:

【参考方案6】:

您可以将以下函数用于相对路径,因为绝对路径不是添加到脚本中的好主意

导入

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

【讨论】:

【参考方案7】:
driver.save_screenshot("path to save \\screen.jpeg")

【讨论】:

【参考方案8】:

当然它现在不是实际的,但我也遇到了这个问题,而且我的方式是: 看起来“save_screenshot”在创建名称中有空格的文件时遇到了一些麻烦,因为我在文件名中添加了随机化以进行转义覆盖。

在这里,我找到了清除文件名中空格的方法 (How do I replace whitespaces with underscore and vice versa?):

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'

【讨论】:

【参考方案9】:

使用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')

【讨论】:

嗨,driver.save_screenshot('/path/to/file') 在 Windows 上工作,但 driver.get_screenshot_as_file('/path/to/file') 不行。 (是的,我改成了“\\”)。但它有帮助,谢谢。你知道如何用硒检查谷歌的 ReCaptcha 吗?您将无法选择任何元素,即使 html 生成 <div class="google-recaptcha"> 或其他... JS 脚本也不起作用。 为了澄清,我不是指在reCaptcha中解决图像,而只是选中一个复选框“我不是机器人”。 @TommyL: save_screenshot calls get_screenshot_as_file,所以如果一个有效,那么另一个也应该。 @TommyL:关于recaptcha——尝试谷歌搜索类似“selenium click google recaptcha”的内容。有许多潜在的潜在客户,例如this one。如果这对您不起作用,您可以考虑发布一个新问题 - 包括您的代码,以便我们了解您尝试了什么以及出了什么问题。 另一件事对我帮助很大,如果您需要更改图像尺寸,只需在拍摄快照之前使用driver.set_window_size(1366, 728)设置窗口大小【参考方案10】:

受此线程启发(Java 的问题相同):Take a screenshot with Selenium WebDriver

from selenium import webdriver

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

【讨论】:

【参考方案11】:

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

如果你在 python webriver 中工作,请使用下面的代码。它非常简单。

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

【讨论】:

【参考方案12】:

我知道您正在寻找 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”中提供绝对或相对路径,这样我就可以将图像保存在任何地方。

【讨论】:

以上是关于Webdriver 截图的主要内容,如果未能解决你的问题,请参考以下文章

Webdriver 截图

Selenium webdriver截图

怎么用Selenium webdriver进行截图操作

Selenium+Python+Webdriver:保存截图到指定文件夹

selenium - webdriver - 截图方法get_screenshot_as_file()

Selenium PhantomJS webdriver获得部分截图