chrome driver 截图和填表

        昨天突然有一个需求(自己的),想把某个网站题目主体部分翻译并保存成图片,开始时用了国内网站的翻译(人工、简单翻译),后来发现很多地方翻译的不尽人意,于是只好用翻译插件对原始网站进行翻译,插件会在每段后面插入翻译内容、设置使用背景色后显得不凌乱,效果还不错(至少尊重原文描述,保证了题意清晰)。本来想着爬取文本,然后做翻译什么的,但实际使用时需要仅允许使用一个网站,其他的都屏蔽掉,只好截图了。遇到几个问题,记录一下,有用到的拿走不谢:

〇、首先,你要NUGET这玩意和webdriver,然后导入它们

Imports OpenQA.Selenium
Imports OpenQA.Selenium.Chrome

一、官方文档,各种参数老全了List of Chromium Command Line Switches « Peter Beverlooicon-default.png?t=N7T8https://peter.sh/experiments/chromium-command-line-switches/二、带翻译的截图

        开始说过,搞了一下有简单翻译的网页,直接截图就可以。但是,带有插件的就麻烦很多:

1、开启插件:可以加载指定扩展或者干脆加载用户设置

        加载用户设置可以让我们直接使用设置好的chrome,非常方便:

options.AddArgument("--user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/")

2、开始整活

        众所周知,一个自动化程序,弹出chrome就很low。于是,苦难开始了:

       

options.AddArguments("--headless")

         似乎应该可以有效吧!确实有效,浏览器窗口没了,插件也跟着没了——即使你开启了插件的各种权限和自动翻译。折腾吧,改用以下语句:

options.AddArguments("--headless=new")  '新无头模式可以正常加载插件

        然后,加上各式各样的其他参数,就可以启动chromedriver.exe了:

       If options Is Nothing Thenoptions = New ChromeOptions()'加载用户配置。解决不加载插件的方法是让浏览器显示出来,然后重新安装一遍。。。。而后打开这个设置即可options.AddArgument("--user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/")'设置浏览器参数options.AddArguments("--headless=new")  '新无头模式可以正常加载插件options.AddArguments("--no-sandbox")options.AddArguments("--disable-gpu")options.AddArguments("--disable-dev-shm-usage")'单进程运行'options.AddArgument("--single-process")'固定端口'options.AddArguments("--remote-debugging-port=13888")End IfIf driver Is Nothing Then driver = New ChromeDriver(options)

        嘎嘎完美,如果按下葫芦瓢没飘起来——chromedriver.exe又出来整活了,这个命令行窗口还得藏起来。把搜索引擎搜索的直冒火星子之后,发现这么两句:

        Dim service As ChromeDriverService = ChromeDriverService.CreateDefaultService()service.HideCommandPromptWindow = True

        这一看就顾名思义了,估摸搞定了!然并卵,这个语句创建了一个默认配置的服务,可是我们并没有用它啊,是不是赶脚少点啥,就像上了一天学都在神游回到家赶脚心里空落落的,酱紫:

If driver Is Nothing Then driver = New ChromeDriver(service, options)

        至此,用之前爬取的题目列表继续爬原始网站,截图带翻译的题目即可。

        driver.Navigate().GoToUrl(purl & pid)Thread.Sleep(8000)  '如果不需要翻译可以少一些'把宽度设置成题目栏最大宽度driver.Manage.Window.Size = New Size(1258, 1024)Thread.Sleep(100)  '如果不需要翻译可以少一些'获取高度和宽度一定要在设置URL之后,不然会导致获取不到页面真实的宽高;Dim Width As Integer = driver.ExecuteScript("return document.documentElement.scrollWidth")Dim Height As Integer = driver.ExecuteScript("return document.body.parentNode.scrollHeight")'设置宽高否则无法截全,这种模式必须运行在--headless下,否则窗体无法超过屏幕高度driver.Manage.Window.Size = New Size(1258, Height)Thread.Sleep(100)Dim ss As Screenshot = CType(driver, ITakesScreenshot).GetScreenshot()

        ss就是个图像了,想怎么剪裁啥的那不归本文管了。

        PS:别想太多,现在就是整个页面——无论它高度是否超过屏幕高度。但,这只能在options.AddArguments("--headless=new")或没有=new的模式下使用,一旦你显示chrome窗口,那么它将无法突破windows对窗口高度的限制——即使你设置的足够高,也会被自动设置为不超过屏幕高度。(似乎用WINAPI设置可以突破,但如果你用鼠标移动这个窗口它又被限制,可能WIN7下如此表现,其他版本emmmmmm,记不清楚了,有兴趣的可以试一试。)

三、自动填写表单

        这个有自动提交功能,而且很有趣。代码接上文:

        driver.Navigate().GoToUrl("https://ooxx.com")Thread.Sleep(2000)driver.FindElement(By.Id("handleOrEmail")).SendKeys("aooooooooooo@163.com")driver.FindElement(By.Id("password")).SendKeys("emmmmmmmmmmmm")driver.FindElement(By.Id("enterForm")).Submit()Thread.Sleep(2000)

        大概这样就可以登录了。这个工具里面输入啥的都是用SendKeys,并且我没有发现直接改属性的函数——当然,这不影响你自己写一段java程序然后使用它的接口运行。很有可能还需要取一些ooxx_token啥的,打开下个网页需要用到,但这也不归本文管啊!

        下面演示一段好玩的东西——因为我没整明白HTML.Select这个玩意在chromedriver里面到底咋操作,有会的还请不吝赐教:

        '戳一下下拉列表,有的下拉列表现生成的,不戳不行Dim slt = driver.FindElement(By.Name("programTypeId"))slt.Click()Thread.Sleep(2000)'这个列表的text属性会列出全部optionDim cnt As Integer = slt.Text.Split(vbCrLf).Length'开始整活,要的选项的value=50,开始按上下吧,For i As Integer = 1 To cntIf slt.GetAttribute("value") = "50" Then Exit Forslt.SendKeys(Keys.ArrowDown)Thread.Sleep(200)NextFor i As Integer = 1 To cntIf slt.GetAttribute("value") = "50" Then Exit Forslt.SendKeys(Keys.ArrowUp)Thread.Sleep(200)Next

        幸亏人家网站自动记录上次选的是哪个,不然这看起来老low了——全自动填表的半自动人工智障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/171051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cjson库打包数据实现方法

使用 cJson 库,在C语言环境下,打包一个cJson字符串: int CreateArryJsonString(void) {cJSON *cJsonArr cJSON_CreateArray();cJSON *sJsonObj1 cJSON_CreateObject();cJSON_AddStringToObject(sJsonObj1, "test1", "test1…

动态规划学习——子序列问题

目录 ​编辑 一,最长定差子序列 1.题目 2,题目接口 3,解题思路及其代码 一,最长定差子序列 1.题目 给你一个整数数组 arr 和一个整数 difference,请你找出并返回 arr 中最长等差子序列的长度,该子序列…

机器学习【03】在本地浏览器使用远程服务器的Jupyter Notebook【conda环境】

1.激活虚拟环境 conda activate 虚拟环境名字2.虚拟环境下安装jupyter notebook pip install jupyter3.配置 jupyter 文件 在 Jupyter Notebook 的配置目录中生成一个配置文件 jupyter_notebook_config.py jupyter notebook --generate-config3.设置密码 jupyter notebook …

C/C++ 常用加密与解密算法

计算机安全和数据隐私是现代应用程序设计中至关重要的方面。为了确保数据的机密性和完整性,常常需要使用加密和解密算法。C是一种广泛使用的编程语言,提供了许多加密和解密算法的实现。本文将介绍一些在C中常用的加密与解密算法,这其中包括Xo…

操作NAND flash W25N01G

文章目录 W25N01G1 描述2 特点3 封装3.3.2 连接线 4 引脚/CSDO/WP/Hold SPI指令标准SPI命令双SPI四元SPI命令写保护 5 地址PA与PC最后一个扇区 OTP寄存器1块保护清除块保护指令* WP-E 寄存器2寄存器3BUSYP-FAILE-FAILECC位 8 命令8.1 装置ID 指令解读写状态寄存器 注意内容上拉…

企业编码生成程序Python毕业设计

(1)生成6位数字防伪编码。当用户在主程序界面中输入数字“1”菜单项时,将进入“生成6位数字防伪编码 (213563型)”的功能执行任务。此时要求输入生成防伪码的数量,可以根据需要输入生成防伪码的数量。按下&…

范围查询 range级别 继续优化思路

问题&#xff1a; 这几天工作遇到了一个问题。千万级别的表&#xff0c;每秒钟产生很多数据&#xff0c;select count(id) from table where flag 1 and create_time < 2023.11.07;分区表&#xff0c;range级别&#xff0c;已经是走create_time列上的索引&#xff0c;flag…

springboot宠物店管理系统-计算机毕设 附源码 32041

SpringBoot宠物店管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;宠物行业当然也不例外。宠物店管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理…

python pdf转txt文本、pdf转json

文章目录 一、前言二、实现方法1. 目录结构2. 代码 一、前言 此方法只能转文本格式的pdf&#xff0c;如果是图片格式的pdf需要用到ocr包&#xff0c;以后如果有这方面需求再加这个方法 二、实现方法 1. 目录结构 2. 代码 pdf2txt.py 代码如下 #!/usr/bin/env python # -*- …

【ArcGIS Pro微课1000例】0037:ArcGIS Pro中模型构建器的使用---以shp批量转kml/kmz为例

文章目录 一、ArcGIS Pro模型构建器介绍二、shp批量转kml/kmz1. 打开模型构建器2. 添加工作空间4. 添加【创建要素图层】工具5. 添加【图层转kml】工具6. 输出文件命名7. 运行模型三、模型另存为1.py文件2. 保存为工具一、ArcGIS Pro模型构建器介绍 模型构建器是一种可视化编程…

C语言从入门到精通之【表达式和语句】

1 表达式 表达式由运算符和运算对象组成&#xff0c;最简单的表达式一个单独的运算对象。每个表达式都有一个值&#xff0c;并且是根据运算符优先级规定的顺序来执行&#xff0c;以下是一些表达式&#xff1a; 4 -6 421 a*(b c/d)/20 q 5*2 x q % 3 #q > 3 2 语句 语句…

yolov5从英伟达平台移植到华为昇腾开发板上的思路

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近需要将yolov5代码从英伟达平台移植到华为昇腾开发板上。搜了一些代码和资料&#xff0c;大致明白了二者的差别。 1.二者使用的模型文件不一样 yolov…

【unity实战】实现一个放置3d物品建造装修系统(附项目源码)

文章目录 最终效果前言绘制开始场景素材开始放置旋转物体扩展优化1. 绘制地图边界&#xff0c;确保放置物品在指定区域内工作2. 让模型所占面积大小更加准确3. 隐藏白色瓦片指示区域 最终效果其他源码参考完结 最终效果 前言 其实3d物品建造装修系统之前就已经做过了&#xff…

2024年天津天狮学院食品质量与安全专业《普通化学》考试大纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《普通化学》考试大纲 一、考试性质 《普通化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…

[计算机网络]运输层概述

虽然我自己也不知道写在前面和前言有什么区别..... 这个系列其实是针对<深入浅出计算机网络>的简单总结,加入了一点个人的理解和浅薄见识,如果您有一些更好的意见和见解,欢迎随时协助我改正,感激不尽啦. 最近心态平和了不少, 和过去也完全做了个割舍吧,既然痛苦和压力的…

记录华为云服务器(Linux 可视化 宝塔面板)-- 安全组篇

文章目录 前言安全组说明安全组的特性安全组的应用场景 进入安全组添加基本规则添加自定义规则如有启发&#xff0c;可点赞收藏哟~ 前言 和windows防火墙类似&#xff0c;安全组是一种虚拟防火墙&#xff0c;具备状态检测和数据包过滤功能&#xff0c;可以对进出云服务器的流量…

typeof,instanceof

1.typeof typeof运算符返回的结果是以小写的字符串表示的变量的类型 2.instanceof instanceof运算符用于判断右边构造函数的原型对象是否在左边对象的原型链上 let arr[]let obj{}let datenew Dateconsole.log(arr instanceof Array)console.log(arr instanceof Object)conso…

Maven 简单配置阿里云镜像

配置步骤&#xff1a; 1、找到 maven 的安装目录&#xff0c;修改settings.xml 2、在文件中找到<mirrors>标签&#xff0c;然后再标签中添加阿里云配置即可 <mirror><id>aliyunmaven</id><mirrorOf>*</mirrorOf><name>阿里云公共…

巧妙之中见真章:深入解析常用的创建型设计模式

设计模式之创建型设计模式详解 一、设计模式是什么&#xff1f;二、模板方法2.1、代码结构2.2、符合的设计原则2.3、如何扩展代码2.4、小结 三、观察者模式3.1、代码结构3.2、符合的设计原则3.3、如何扩展代码3.4、小结 四、策略模式4.1、代码结构4.2、符合的设计原则4.3、如何…