如何使用ChromeHeadLess 技术实现后台对前台页面截屏
如何使用ChromeHeadLess 技术实现后台对前台页面截屏
- 1 chrome headless
- 1.1 什么是chrome headless
- 1.2 chrome headless的作用
- 1.3 chrome headless和PhantomJs的对比
- 2 使用chrome headless在服务端实现对页面截图
- 2.1 下载ChromeDriver
- 2.2 引入selenium-server-standalone.jar
- 2.3 代码实现示例
- 2.4 运行及截图效果
- 3 服务端使用chrome headless获取网页信息
- 3.1获取当前浏览器的信息
- 3.2 执行js脚本
- 3.3获取单个元素
- 3.4获取多个元素
- 3.5定位层级元素
- 3.6获取当前的窗口
- 3.7处理弹出框
- 3.8处理下拉列表
- 3.9处理cookie
- 3.10模拟鼠标和键盘操作
1 chrome headless
1.1 什么是chrome headless
Chrome Headless 是 Chrome 浏览器的无界面形态,是Google 针对 Chrome 浏览器 59版
新增加的一种模式,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行你的程序。相比于现代浏览器,Headless
Chrome 更加方便测试 web 应用,获得网站的截图,做爬虫抓取信息等。相比于出道较早的 PhantomJS,SlimerJS
等,Headless Chrome 则更加贴近浏览器环境。
1.2 chrome headless的作用
①可以加快UI自动化测试的执行时间,对于UI自动化测试,少了真实浏览器加载css,js以及渲染页面的工作。无头测试要比真实浏览器快的多。
②可以在无界面的服务器或CI上运行测试,减少了外界的干扰,使自动化测试更稳定。
③在一台机器上可以模拟运行多个chrome headless无头浏览器,方便进行并发测试。
1.3 chrome headless和PhantomJs的对比
自2017年中以来,Chrome用户可以选择以headless模式运行浏览器。此功能非常适合运行前端浏览器测试,而无需在屏幕上显示操作过程。在此之前,这主要是PhantomJS的领地,但Headless Chrome正在迅速取代这个由JavaScript驱动的WebKit方法。Headless Chrome浏览器的测试运行速度要快得多,而且行为上更像一个真正的浏览器,虽然我们的团队发现它比PhantomJS使用更多的内存。有了这些优势,用于前端测试的Headless Chrome基本已成为事实上的标准。
Headless Chrome对比PhantomJS的优点:
1、PhantomJs无法对动态页面进行截图,而chrome headless可以时实现
2、Headless Chrome加载速度比PhantomJS快55%
3、Headless Chrome消耗内存比PhantomJS少38%
4、Headless Chrome比phantomjs有更快更好的性能。Headless Chrome出自Google,可以避免出现类似phantomjs近2k问题没人维护的尴尬局面。
5、chrome对ECMAScript 2017 (ES8)支持,同样headless随着chrome更新,意味着我们也可以使用最新的js语法来编写的脚本,例如async,await等。
6、完全真实的浏览器操作,chrome headless支持所有chrome特性.
2 使用chrome headless在服务端实现对页面截图
2.1 下载ChromeDriver
前提是已安装谷歌浏览器,根据谷歌浏览器的版本,下载相应版本的ChromeDriver,无对应版本时可选择相近版本。
ChromeDriver下载地址:http://npm.taobao.org/mirrors/chromedriver/
2.2 引入selenium-server-standalone.jar
方法1 Maven配置pom文件引入:
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.6.0</version>
</dependency>
方法2下载jar包导入:
下载地址:http://selenium-release.storage.googleapis.com/index.html
选择合适版本下载到本地,在项目中导入即可。
2.3 代码实现示例
示例代码如下,其功能是将https://www.baidu.com 百度页面在后台截图并保存为”D:\headless\cut1.png”。
// 设置驱动地址
System.setProperty("webdriver.chrome.driver",
"D:\\headless\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
// 设置谷歌浏览器exe文件所在地址
options.setBinary("C:\\Program Files (x86)\\Google\\Chrome\\Application
\\chrome.exe");
// 这里是要执行的命令,如需修改截图页面的尺寸,修改--window-size的参数即可
options.addArguments("--headless", "--disable-gpu", "--window-size=1920,1200", "--ignore-certificate-errors");
WebDriver driver = new ChromeDriver(options);
// 访问页面
driver.get("https://www.baidu.com");
// 页面等待渲染时长,如果你的页面需要动态渲染数据的话一定要留出页面渲染的时间,单位默认是秒
Wait<WebDriver> wait = new WebDriverWait(driver, 3);
wait.until(new ExpectedCondition<WebElement>() {public WebElement apply(WebDriver d) {//等待前台页面中 id为“kw”的组件渲染完毕,后截图
//若无需等待渲染,return true即可。 不同页面视情况设置idreturn d.findElement(By.id("kw"));}
});
// 获取到截图的文件
File screenshotFile = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.FILE);
if ((screenshotFile != null) && screenshotFile.exists()) {//截取到的图片存到本地FileOutputStream out = null;FileInputStream in = null;try {in = new FileInputStream(screenshotFile);out = new FileOutputStream("D:\\headless\\cut1.png");byte[] b = new byte[1024];while (true) {int temp = in.read(b, 0, b.length);// 如果temp = -1的时候,说明读取完毕if (temp == -1) {break;}out.write(b, 0, temp);}} catch (Exception e) {//TODO异常处理}
}
2.4 运行及截图效果
后台运行效果
截图效果
3 服务端使用chrome headless获取网页信息
3.1获取当前浏览器的信息
System.out.println("Title:" + driver.getTitle());
System.out.println("currentUrl:" + driver.getCurrentUrl());
3.2 执行js脚本
String jString = "alert('122')";
((JavascriptExecutor) driver).executeScript(jString);
3.3获取单个元素
WebElement element = driver.findElement(By.id("wrapper"));
System.out.println(element.getAttribute("class"));
3.4获取多个元素
List<WebElement> elList = driver.findElements(By.tagName("input"));
for (WebElement e : elList) {System.out.println("获取多个元素:" + e.getAttribute("name"));
}
3.5定位层级元素
WebElement e = driver.findElement(By.cssSelector("#qrcode-item qrcode-item-1"));List<WebElement> list = e.findElements(By.tagName("div"));for (WebElement e1 : list) {System.out.println("定位层级元素:"+e1.getAttribute("class"));}
3.6获取当前的窗口
String currentWindow = driver.getWindowHandle();
Set<String> handles = driver.getWindowHandles();
// 遍历窗口
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()) {if (currentWindow == iterator.next())continue;// 跳转到弹出的窗口WebDriver driver2 = driver.switchTo().window(iterator.next());driver2.getTitle();
}
3.7处理弹出框
Alert alert = driver.switchTo().alert();
alert.getText();
alert.dismiss();// 相当于点击取消
Alert confirm = driver.switchTo().alert();
confirm.getText();
confirm.accept();// 相当于点击确认
Alert prompt = driver.switchTo().alert();
prompt.getText();
prompt.accept();
prompt.sendKeys("测试1");// 输入值
3.8处理下拉列表
Select select = new Select(driver.findElement(By.id("select")));select.selectByIndex(1);select.selectByValue("湖北");select.selectByVisibleText("咸宁");//获取下拉框的全部选项List<WebElement> list2 = select.getOptions();for (WebElement webElement : list2) {webElement.click();//点击下拉框 }
3.9处理cookie
//添加一个cookieCookie cookie = new Cookie("COOKIE", "NAME","D://COOKIES");driver.manage().addCookie(cookie);//获取cookies
Set<Cookie> set = driver.manage().getCookies();
Iterator<Cookie> iterator2 = set.iterator();while (iterator2.hasNext()) {Cookie c = iterator2.next();c.getName();c.getValue();c.getPath();}driver.manage().deleteAllCookies();driver.manage().deleteCookie(cookie);driver.manage().deleteCookieNamed("COOKIE");
3.10模拟鼠标和键盘操作
Actions action = new Actions(driver); action.click();action.dragAndDrop(element, e);action.sendKeys(element,"12222").perform();action.click(element);action.keyDown(currentWindow);
【转载说明】:转载请说明出处,谢谢合作!~
如何使用ChromeHeadLess 技术实现后台对前台页面截屏相关推荐
- anydesk截屏技术
anydesk针对不同的操作系统使用了不同的截屏技术 针对NT5系统使用DDraw截屏. 针对NT6系统优先使用DXGI截屏,如果不支持DXGI则使用DX截屏. 为什么这样做呢?首先DirectDra ...
- java cms bootstrap_thinkcms: Java CMS系统,完善的后台功能,大气的前台页面.
使用springMVC,hibernate,bootstrap,amazeui....
#thinkcms Java CMS系统,完善的后台功能,大气的前台页面 主要技术 springmvc-mvc控制层 shiro-方便全面的安全控制框架 hibernate-orm框架 ehcache ...
- Android家长老师家校校园通(IDEA开发,后台管理,前台app)
[源码下载] 手把手教做Android家长老师家校校园通(IDEA开发,后台管理,前台app)视频教程 开发工具: AndroidStudio Idea Mysql 技术栈: Web端 后台前端: ...
- js 后台调用前台的JS
前台JS是这样的 function HoverLi(n){ //如果有N个标签,就将i<=N; for(var i=1;i<=3;i++){g('tb_'+i).className='no ...
- aspx后台调用前台jquery_Jquery Ajax调用aspx页面方法
在asp.net webform开发中,用jQuery ajax传值一般有几种玩法 1)普通玩法:通过一般处理程序ashx进行处理: 2)高级玩法:通过aspx.cs中的静态方法+WebMethod进 ...
- c#调用js脚本报错_C#后台调用前台JS函数方法
总结了公司其他人的一些C#后台调用前台的方法: 方法一: 假设前台页面的JS脚本标签中有如下函数: function A() { alert("hello word!"); } 那 ...
- 使用 WorkManager 管理后台和前台工作
随着设备性能提升和软件生态发展,越来越多的 Android 应用需要执行相对更复杂的网络.异步和离线等任务.例如用户想要离线观看某个视频,又不想一直停留在应用界面等待下载完成,那么就需要以一定的 ...
- mvc 怎么把后台拼接好的div写到前台_MVC 从后台页面 取前台页面传递过来的值的几种取法...
<1>前台页面 Index视图 注意:用户名表单的name值为txtName 密码表单的name值为txtPassword Test 用户名 密 码 <2>后台页面,Home控 ...
- JEECG - 基于代码生成器的J2EE智能开发框架 续六: JEECG 前台页面和后台交互讲解
近期有朋友对 EasyUI和后台交互方式不理解,特做一下简单整理,希望能对大家有所帮助!!! 一般情况下一个功能模块分为:增.删.改.查四个功能点; 针对功能的页面设计如下: [OLD]老式页面设计采 ...
最新文章
- 基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程
- Windbg程序调试--转载
- Linux命令:和输出
- 安装mariadb以及允许远程访问
- 函数基本使用-第一个函数演练
- 2014年中国新闻业年度观察报告
- Java获取当前日期的前一个月,前一天的时间
- 视频操作_01视频读写:视频读写+读取视频+保存视频
- 西南科技大学研究生计算机,我们毕业啦……西南科技大学2020研究生毕业记!...
- js连续指定两次或者多次的click事件(解决办法)
- sqlserver修改字段长度语句_SQL Server读懂语句运行 (三) SET STATISTICS PROFILE ON
- SUN公司经典linux教材转自http://blog.chinaunix.net/uid-20446831-id-1677336.html
- springboot做网站_Github点赞接近10万的SpringBoot学习教程+实战推荐!牛批!
- 博弈论——威佐夫博弈 Wythoff Game
- Activity及其生命周期
- H5左滑动不能单独滑动问题和上下滚动不了问题的解决办法
- 室内场馆360全景拍摄的注意事项
- SPSS简单数据分析之分类汇总数据
- LeetCode 9. 回文数 Palindrome Number
- CSDN~BLOG目录