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,一经查实,立即删除!

相关文章

2311skia,04绘制路径

分析Skia绘画路径代码 绘画路径尽管使用频率相对绘画图像,绘画文本低,但却是非常重要的一个基本特性.所有不规则图形(椭圆,圆角矩形,三角形,简单的文字),最后都要绘画路径. 而且,若自己实现一个2D引擎,这块内容是很有参考意义的,用OpenGL,都很少关注采样图像了,对对坐标就好. …

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…

[vxe-table] vxe-table-column配合v-if导致列样式与位置错乱

<vxe-table-column v-if"pageInfo.id 4 ||pageInfo.id 8" title"上报类型" width"100" key1><template v-slot"{row}"><span>咨询工具</span></template> </vxe-table-column>//或者<vxe-ta…

操作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 指令解读写状态寄存器 注意内容上拉…

Java,File类与IO流,处理流:缓冲流、转换流、数据流、对象流

目录 处理流之一&#xff1a;缓冲流 四种缓冲流&#xff1a; 缓冲流的作用&#xff1a; 使用的方法&#xff1a; 处理文本文件的字符流&#xff1a; 处理非文本文件的字节流&#xff1a; 操作步骤&#xff1a; 处理流之二&#xff1a;转换流 转换流的使用&#xff1a; …

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

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

范围查询 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;运用软件工程原理…

多级嵌套vue同步调用用法

//需求 要求同步调用initGame2方法 //调用方法 this.initSocket(); //定义方法为同步 async initSocket() { //调用为同步 await this.initGame2(); //定义方法为同步 async initGame2() {const e await w({ url: //定义w方法 const w e.create({ baseURL: http://my_url:8…

python pdf转txt文本、pdf转json

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

H5ke12--3--iframe--编辑邮箱的制作

下面我们来window.iframes[] frames是一个全局变量&#xff0c;它是一个对象数组&#xff0c;其中包含当前窗口中的所有框架&#xff08;如果存在&#xff09;。 在这段代码中&#xff0c;let frameframes[0];是将第一个框架赋值给变量frame。通过frame.document.designMode&q…

【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模型构建器介绍 模型构建器是一种可视化编程…

感冒的六大经方2

3 葛根汤 处方内容是&#xff1a;葛根15克&#xff0c;麻黄5克&#xff0c;桂枝10克&#xff0c;白芍10克&#xff0c;生薑二片&#xff0c; 炙甘草10克&#xff0c;大枣十枚 每付药加入六碗水使用大火来煮成二碗&#xff0c;成人于每三小时空腹时喝一碗&#xff0c;小孩减半…

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…