python怎样进行屏幕截图?使用selenium捕获屏幕并截图全教程


在此 Python Selenium 屏幕截图教程中,我们将探索使用 Selenium 库进行屏幕截图的不同方法。同时我们将回顾下selenium的安装以及基本结构。

任何寻找开源、免费测试自动化工具的 Web 开发人员的首选软件框架都会是 Selenium。selenium的api上手简单、操作方便,并且支持它各种编程语言的兼容性,包括 Java、Python、PHP、Perl 和 C#。Selenium 还可以用作网络抓取工具或创建人工复制机器人来自动化社交媒体或 测试 PDF 文件。

在开始捕获 Python Selenium 屏幕截图之前,让我们先熟悉一下 Selenium Python 的安装配置。
 

什么是 Selenium Python 绑定?

硒有不同的成分。我们有 Selenium WebDriver、Selenium IDE 和 Selenium Grid。Selenium Python 绑定是一个 API 接口,用于将 Python 与 Selenium WebDriver 结合使用来编写功能/验收测试。我们将使用这些用于 Selenium 的 Python 绑定来捕获整页屏幕截图和特定于 HTML 元素的屏幕截图,并将它们保存在我们想要的位置。

安装依赖

在我们学习如何使用 Selenium Python 进行屏幕截图之前,我们需要安装一些依赖项。以下是您机器上所需的所有内容的列表:

  • Python
  • 知识产权
  • Selenium Python 绑定
  • 壁虎司机
  • ChromeDriver

要学习如何使用 Selenium Python,您必须在您的系统或服务器上安装 Python 和 pip。Python 预装在 Linux 和 Mac 系统中。对于 Windows,您可以从 Python 的官方网站下载 Python 安装程序:

下载 Python

注意 Python 2 现在是多余的。所以,如果你的 Linux 或 Mac 系统是旧版本,你可以考虑将它们更新到最新、最稳定的版本。

您还需要在系统上安装 pip。pip 是 Python 的工具或包管理器工具,并预装了最新版本(如上图所示)。您可以通过在命令提示符下运行以下命令来查看它是否存在于您的系统中:

pip help

如果你从 pip 得到如下的响应,你就可以开始了:

点响应

如果它显示这样的东西:

其他点响应

然后你必须将这个get-pip.py 文件下载到你系统中的任何位置,但你应该有文件的路径。请记住,只有在您的系统中未安装 pip 时才需要执行此操作。

接下来,运行此命令来安装 pip:

python get-pip.py

如果您不在下载文件所在的目录中,请将上面给出的命令中的文件名替换为文件位置的完整路径。

现在,再次尝试 pip 命令,您应该会看到我们之前共享的屏幕。

接下来,我们将使用 pip 安装 Selenium Python 绑定。然后,您将必须运行以下命令:

pip install selenium

这会在您的系统中安装 Selenium 的 Python 绑定。或者,如果您不喜欢这种安装机制,您可以从 Pypi 下载 Selenium-Python 源代码分发并取消存档。执行此操作后,运行以下命令来安装绑定:

python setup.py install

同样,请记住,如果您不想使用 pip 安装,则只需要这个。此外,如果您不在存档下载的 Selenium Python 绑定的同一文件夹中,请将其替换setup.pysetup.py.

接下来,我们需要一个驱动程序来继续点击 Python Selenium 网页截图。

您可以选择您选择的任何浏览器并从以下链接下载驱动程序:

  • Chrome:“ChromeDriver—Chrome 的 WebDriver”
  • 火狐
  • Edge:“Microsoft Edge WebDriver”
  • Internet Explorer:“Selenium Release Storage Google APIs”

现在,让我们制作一个名为check_setup.py在其中写入如下代码:

from selenium import webdriver browser = webdriver.Firefox() browser.get(“https://www.lambdatest.com”) 

 

这应该启动一个 Firefox 实例并自动加载 LambdaTest 主页。如果这对您有用,我们就可以捕获网站的 Python Selenium 屏幕截图了。

使用 Python 和 Selenium 捕获屏幕截图

我希望现在您已经安装了所有依赖项并且知道如何使用 Selenium Python。是时候进入好的部分了。 

在本节中,我们将了解如何为任何网页截取 Python Selenium 屏幕截图。我们将看到 GeckoDriver 和 ChromeDriver 的实例。首先,让我们看看如何将 Selenium Python 与 GeckoDriver 或 Selenium FirefoxDriver 一起使用。

将 get_screenshot_as_file() 与 GeckoDriver 一起用于 Python Selenium 屏幕截图

from selenium import webdriver 
    from time import sleep 
    browser = webdriver.Firefox() 
    browser.get(“https://www.lambdatest.com/”) 
    sleep(1) 
    browser.get_screenshot_as_file(“LambdaTestVisibleScreen.png”) 
    browser.quit() 

 

如果您想将这些图像存储在项目目录以外的特定位置,请将完整路径指定为get_screenshot_as_file.

代码演练

让我们了解我们在这里做什么:

  • from selenium import webdriver:这一行导入我们用来启动浏览器实例并使用 API 与 Web 元素交互的 WebDriver。
  • from time import sleep:此行从 Python 的“时间”模块导入睡眠函数。这接受整数参数,等于秒数。该脚本在执行下一行代码之前等待指定的秒数。
  • browser = webdriver.Firefox(): 这行等同于说,使用关键字“浏览器”就像您使用的那样webdriver.Firefox()
browser.get(“https://www.lambdatest.com”)

 

这将启动一个由 Selenium 驱动程序控制的 Firefox 实例,并获取指定为get(argument)函数参数的 URL。

  • sleep(1):这会使脚本停止运行一秒钟。当页面上有动画或者您明确想要等待一段时间以便可以执行某些操作或页面可以完全加载时,通常需要执行此步骤。

注意默认情况下,Selenium WebDriver 在执行下一行脚本或操作之前等待页面完全加载。但在一些高级 JavaScript 呈现的网站中,我们可能需要使用“睡眠”来手动暂停脚本一段时间,以便动画和页面本身完全加载。

browser.get_screenshot_as_file(“LambdaTestVisibleScreen.png”) 

 

上面的代码最终在启动的 Firefox 实例中单击网页的可见部分,并使用指定的名称和扩展名保存屏幕截图。

  • browser.quit(): 需要关闭浏览器,这一行也是如此。

将 save_screenshot() 与 GeckoDriver 一起用于 Python Selenium 屏幕截图

这是保存整页截图的最简单方法。只需将get_screenshot_as_file命令替换为save_screenshot,如下所示:

browser.get_screenshot_as_file(“LambdaTestVisibleScreen.png”) 

 

会变成如下代码: 

driver.save_screenshot(‘your_desired_filename.png’) 

 

接下来,我们将看到如何在 Selenium ChromeDriver 的帮助下使用 Selenium Python 捕获屏幕截图。

将 screenshot() 与用于 Python Selenium 屏幕截图的 ChromeDriver 一起使用

save_screenshot功能适用​​于 ChromeDriver,但为了提出替代解决方案,我们还将向您展示如何使用屏幕截图功能进行全页屏幕截图。这是脚本: 

from selenium import webdriver 
    from time import sleep 
    from selenium.webdriver import ChromeOptions 
    options = ChromeOptions() 
    options.headless = True 
    browser = webdriver.Chrome(chrome_options=options) 
    URI = “https://www.lambdatest.com” 
    browser.get(URI) 
    sleep(1)
    S = lambda X: browser.execute_script(‘return document.body.parentNode.scroll’+X) browser.set_window_size(S(‘width’), S(‘height’)) 
    browser.find_element_by_tag_name(‘body’).screenshot(‘LambdaTestFullPage.png’) browser.quit() 

 

代码演练

让我们了解我们在这里做什么。首先,在这个例子中,我们使用的是 ChromeDriver。之前我们使用 GeckoDriver 将 Firefox 用作浏览器。或多或少,其他功能是相同的。

from selenium.webdriver import ChromeOptions

 

我们导入 ChromeOptions 以将浏览器设置为无头,以便它在后台运行。我们本可以直接使用webdriver.ChromeOptions,但为了使其更易于理解,我们将其拆分为单独的代码行:

options = ChromeOptions() 
    options.headless = True 
    browser = webdriver.Chrome(chrome_options=options) 
    URI = “https://www.lambdatest.com” 
    browser.get(URI) 

 

在这里,我们使用新设置的 ChromeOptions 并将其作为参数传递给 webdriver 的 Chrome 函数。观察,之前我们使用Firefox()Browser.get,它会启动实例并获取 URL。

S = lambda X: browser.execute_script(‘return document.body.parentNode.scroll’+X) browser.set_window_size(S(‘width’), S(‘height’)) 

 

第一行是一个 lambda 函数,用于查找“X”的值。我们通过执行 DOM JavaScript 函数来获取值。第二行是调整窗口大小:

browser.find_element_by_tag_name(‘body’).screenshot(‘lambdaTestFullPage.png’) browser.quit() 

最后,我们通过驱动函数追踪网页的body元素,find_element_by_tag_name并将“body”作为参数传递。您还可以使用find_element_by_id, find_element_by_xpath定位元素。
我们使用了一个'.' 运算符在同一行嵌套screenshot()函数以捕获整页屏幕截图。最后,我们使用 终止 Chrome 实例browser.quit()

捕获特定元素的 Python Selenium 屏幕截图

我们现在演示如何使用该save_screenshot()函数来捕获页面上的任何元素,例如按钮、图像或表​​单。我们将使用 Python 的 PIL 库,它可以让我们执行图像操作。

我们将在 LambdaTest 网站上捕获一个功能“部分”元素,内容如下 XPath – //section[contains(string(),’START SCREENSHOT TESTING’)]

最终脚本将是:

from selenium import webdriver 
    from time import sleep 
    from PIL import Image 
    browser = webdriver.Chrome() 
    browser.get(“https://www.lambdatest.com/feature”) 
    sleep(1) 
    featureElement = browser.find_element_by_xpath(“//section[contains(string(),’START SCREENSHOT TESTING’)]”) 
    location = featureElement .location 
    size = featureElement .size 
    browser.save_screenshot(“fullPageScreenshot.png”) 
    x = location[‘x’] 
    y = location[‘y’] 
    w = x + size[‘width’] 
    h = y + size[‘height’] 
    fullImg = Image.open(“fullPageScreenshot.png”) 
    cropImg = fullImg.crop(x, y, w, h) 
    cropImg.save(‘cropImage.png’) 
    browser.quit() 

 

该脚本在执行时将从 LambdaTest 网站保存裁剪后的信息元素为cropImage.png.

代码演练

from PIL import Image

该行从 Python 的 PIL 库中导入图像模块。

featureElement = browser.find_element_by_xpath(“//section[contains(string(),’START SCREENSHOT TESTING’)]”)

 

此行使用 XPath 定位 LambdaTest 网站上的一项功能(如下所示。)

路径

location = featureElement .location 
    size = featureElement .size 

 

第一行获取特征元素的垂直和水平起始位置。第二行获取元素的宽度和高度。

我们分别将它们存储在“x”、“y”、“w”和“h”变量中。

fullImg = Image.open(“fullPageScreenshot.png”) 
    cropImg = fullImg.crop(x, y, w, h) 
    cropImg.save(‘cropImage.png’)

 

我们首先打开图像并将字节存储在“fullImg”变量中。接下来,我们使用我们计算的 x、y、w 和 h 参数对其进行裁剪。最后,我们保存裁剪后的图像。

这应该是成功执行代码后您将看到的输出: 

成功输出

屏幕截图在测试自动化中扮演什么角色?

自动截屏有助于轻松识别错误,并且比手动截屏更快。最重要的是,它可以像您正在测试的应用程序一样可扩展,而无需额外的测试人员。以上的直接含义是——自动屏幕截图是一种具有成本效益和时间效率的过程。

获取 Python Selenium 屏幕截图的其他选项

如果您更愿意使用其他方式捕获 Python Selenium 屏幕截图,您还可以使用“Selenium-Screenshot 2.0.0”库进行屏幕截图。要安装它,请执行以下命令:

pip install Selenium-Screenshot

捕获整页屏幕截图的示例

from Screenshot import Screenshot_Clipping 
    from selenium import webdriver
    ob=Screenshot_Clipping.Screenshot() 
    driver = webdriver.Chrome() 
    url = "https://www.google.com" 
    driver.get(url) 
    img_url=ob.full_Screenshot(driver, save_path=r'.', image_name='google.png') 
    driver.quit() 

 

为什么 Selenium 和 Python 非常适合捕获屏幕截图

当涉及到 Selenium 测试自动化时,Selenium 和 Python 是首选。这不仅限于捕获屏幕截图,您可以使用这个很棒的组合做更多的事情。让我们找出原因:

  • Selenium Python 绑定的学习曲线非常小,因为语言本身非常容易上手且直观。
  • 我们可以将它与多种浏览器一起使用,包括流行的浏览器。
  • 与其他语言相比,您需要用 Python 编写的代码行数要少得多。
  • 强大的社区支持。
  • 更快更高效的执行。

结论

在本教程中,我们学习了使用 Selenium 和 Python 来捕获网页的屏幕截图。这本质上是有效捕获错误并为您的团队节省大量时间的最佳方法。执行跨浏览器测试的最佳方法是比较网页在多个浏览器或设备上的呈现方式。

您可以使用基于云的平台(如 LambdaTest)来捕获您网站的屏幕截图或特定网页,而无需经历编写代码的麻烦。您可以在 Selenium Grid 云上选择 3000 多个浏览器和操作系统来执行此操作。我们希望当您不想编写所有代码而只想寻找一些错误时,这些工具会派上用场。

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/295285.html

(0)
上一篇 2023年2月10日
下一篇 2023年2月10日

发表回复

登录后才能评论