ChromeDriver截图
一、NuGet安装Selenium.Chrome.WebDriver和Selenium.WebDriver
二、将packages\Selenium.Chrome.WebDriver.2.45\driver下的chromedriver.exe文件,复制到程序的bin目录下
三、截图工具类
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;
using System.ComponentModel.Design;
using System.Drawing;
using System.IO;
using System.Threading; namespace Comon
{
public class ScreenshotUtil : IDisposable
{
/// <summary>
/// 锁
/// </summary>
private static readonly object LockObject = new object(); private static IWebDriver _webDriver; public ScreenshotUtil(string url, int windowWidth, int windowHeight)
{
if (_webDriver == null)
{
lock (LockObject)
{
if (_webDriver == null)
{
ChromeOptions options = new ChromeOptions();
options.AddArgument($"--window-size={windowWidth},{windowHeight}");
options.AddArgument("start-fullscreen");
_webDriver = new ChromeDriver(options);
}
}
}
if (_webDriver.Url != url)
{
_webDriver.Navigate().GoToUrl(url);
}
} public void Dispose()
{
_webDriver?.Quit();
_webDriver = null;
} public static void Quit()
{
lock (LockObject)
{
_webDriver?.Quit();
_webDriver = null;
}
} public void ShotThenSave(string targetFileName, TimeSpan waitTime, Func<IWebDriver, IWebElement> condition)
{
if (!File.Exists(targetFileName))
{
lock (LockObject)
{
if (string.IsNullOrWhiteSpace(targetFileName))
{
throw new ArgumentNullException(nameof(targetFileName));
}
if (condition != null)
{
WebDriverWait webDriverWait = new WebDriverWait(_webDriver, waitTime);
webDriverWait.Until(condition);
} Thread.Sleep(); ITakesScreenshot screenshotDriver = (ITakesScreenshot)_webDriver;
if (screenshotDriver != null)
{
Screenshot screenshot = screenshotDriver.GetScreenshot();
string directoryName = Path.GetDirectoryName(targetFileName);
if (directoryName == null)
{
throw new ArgumentException(nameof(targetFileName));
}
if (!Directory.Exists(directoryName))
{
Directory.CreateDirectory(directoryName);
}
ClearOldImage(directoryName); screenshot.SaveAsFile(targetFileName);
}
}
}
} private static void ClearOldImage(string directoryName)
{
DirectoryInfo folder = new DirectoryInfo(directoryName);
FileInfo[] existFileInfos = folder.GetFiles();
if (existFileInfos.Length > )
{
foreach (var file in existFileInfos)
{
if (file.CreationTime < DateTime.Today)
{
try
{
file.Delete();
}
catch (Exception e)
{
LogUtil.LogException(e);
} }
}
}
}
}
}
ChromeDriver截图的更多相关文章
- java实现网页截图
使用工具 java+selenium+phantomjs /chromedriver /firefox 1.分别是 phantomjs插件 google截图插件 和 firefox火狐浏览器截图插件2 ...
- selenium web driver 实现截图功能
在验证某些关键步骤时,需要截个图来记录一下当时的情况 Webdriver截图时,需要引入 import java.io.File; import java.io.IOException; import ...
- selenium截图对比校验方法
/**对比图片进行校验是否成功**/package com.allin.pc;import java.awt.image.BufferedImage;import java.awt.image.Dat ...
- [Python爬虫] Selenium自动访问Firefox和Chrome并实现搜索截图
前两篇文章介绍了安装,此篇文章算是一个简单的进阶应用吧!它是在Windows下通过Selenium+Python实现自动访问Firefox和Chrome并实现搜索截图的功能. [Pyth ...
- selenium遇到异常自动截图
最近要在框架中添加case失败时,要自动截图,主要又两种方式,思想都是在抛异常的时候,捕获到异常,并作页面截图处理.今天坐下总结. 一.第一种方式,重写onException方法 只针对webdriv ...
- Selenium2学习-035-WebUI自动化实战实例-033-页面快照截图应用之三 -- 区域截图(专业版)
之前有写过两篇博文讲述了 WebUI 自动化测试脚本中常用的截图方法,敬请参阅如下所示链接: 浏览器显示区域截图 浏览器指定区域截图 那么当需要截取的区域不在浏览器显示窗口范围之内时,之前的方法显然无 ...
- Selenium2学习-033-WebUI自动化实战实例-031-页面快照截图应用之二 -- 区域截图
我在之前的文章中曾给出浏览器显示区域截图的方法,具体请参阅 .或许,有些小主已经想到了,每次都获取整个显示区域的截图存储,那么经过一段时间后,所使用的图片服务器的容量将会受到极大的挑战,尤其是在产品需 ...
- selenium 利用testNG对异常进行自动截图
哈哈哈,很久没写博客了,懒了. 因为一些原因最近需要把监听事件重新整理一下,开始没细想,直接copy网上的,其实结果发现报错很多,或者是达不到效果,然后把之前的代码翻出来,仔细看了一下.下面给一些需要 ...
- 关于在selenium 中 webdriver 截图操作
package prictce; import java.io.File; import java.io.IOException; import org.junit.After; import org ...
随机推荐
- JS,JQ 格式化小数位数
在<script>中: $(function(){ var num=$(".price").length;/*获取应用了class="price"的 ...
- UiPath如何实现暂停功能?
照理说一个无人值守的机器人原本是不应该有人工操作介入的,也就不会提供暂停功能.但客户可能出于业务需要,或者风险管控的考虑,会需要机器人具备暂停功能.通常,会希望在机器人运行时,用户摁下快捷键,机器人就 ...
- Percona XtraBackup 关于 MySQL备份还原的详细测试
一. Percona XtraBackup 的优点. (1)无需停止数据库进行InnoDB热备: (2)增量备份MySQL: (3)流压缩传输到其它服务器: (4)在线移动表: (5)能够比较容易地创 ...
- PowerDesigner如何连接数据库--odbc连接数据库用法
先下载msi https://dev.mysql.com/downloads/connector/odbc/ 注:如果不成功,有可能msi版本问题,可以更换一下msi 前期准备 双击odbc的ms ...
- 【English EMail】2019 Q2 Public Holiday Announcement
Hi all, According to 2019 public holiday announcement released by Chinese government, this is to ann ...
- Linux 桌面玩家指南:10. 没有 GUI 的时候应该怎么玩
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
- C#中的RDLC报告
介绍 此示例显示如何在C#中生成RDLC报告,您可以为小型,中型和大型企业生成报告. 构建示例 Visual Studio 2013,.Net Frameworm 4.5,MS SQL Server ...
- qml demo分析(threading-线程任务)
一.关键类说明 qml内置了WorkerScript组件,该组件有一个source属性,可以加载js文件,含有一个名为message的信号,意味着他有一个默认的onMessage槽函数,除此之外他还有 ...
- 通过数据分析告诉你北京Python开发的现状
相信各位同学多多少少在拉钩上投过简历,今天突然想了解一下北京Python开发的薪资水平.招聘要求.福利待遇以及公司地理位置.既然要分析那必然是现有数据样本.本文通过爬虫和数据分析为大家展示一下北京Py ...
- springboot~读取自定义配置项
我们springboot项目有自己默认的配置文件,一般地由application.yml和bootstrap.yml组成,前者是模块的配置,后者是微服务的配置,后台比前者先被框架加载. 我们有时需要自 ...