chrome driver 截图和填表

news2024/11/28 2:39:50

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

〇、首先,你要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 Then
            options = 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 If

        If 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属性会列出全部option
        Dim cnt As Integer = slt.Text.Split(vbCrLf).Length

        '开始整活,要的选项的value=50,开始按上下吧,
        For i As Integer = 1 To cnt
            If slt.GetAttribute("value") = "50" Then Exit For
            slt.SendKeys(Keys.ArrowDown)
            Thread.Sleep(200)
        Next

        For i As Integer = 1 To cnt
            If slt.GetAttribute("value") = "50" Then Exit For
            slt.SendKeys(Keys.ArrowUp)
            Thread.Sleep(200)
        Next

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

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

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

相关文章

【H5 Canvas】【平面几何】特殊图形绘制(【带旋转】箭头/正多边形/正多尖角形等)

文章目录 直线/弧线 箭头 直线/弧线 箭头 // startX,startY 起始坐标 // endX,endY 结束坐标 // radian 圆弧角度,取值[0,PI]; 0表示画直线箭头,否则画圆弧箭头 CanvasRenderingContext2D.prototype.drawArrow function(startX,startY,endX,endY,radia…

【Spring篇】spring核心——AOP面向切面编程

目录 想要彻底理解AOP,我觉得你的先要了解框架的模块化思想,为此先记录框架在讲AOP 什么是java框架?为什么要出现框架? 我总结以下七点来讲述和帮助理解java框架思想 什么是AOP? 如何理解上面这句话呢&#xff1…

HarmonyOS安装三方库遇到的问题

使用开发电脑系统为:MacOS, 开发工具为:DevEco-Studio版本号3.1.1 Release。在控制栏使用终端工具输入命令:ohpm install ohos/lottie遇到的第一个问题如下图。 解决方案: 1、在首选项中找到ohpm的安装路径。 2、打开bash_profil…

电子学会C/C++编程等级考试2022年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:小白鼠再排队 N只小白鼠(1 < N < 100),每只鼠头上戴着一顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从小到大的顺序输出它们头上帽子的颜色。帽子的颜色用 “red”,“blue”等字符串来表示。不同的小白…

pyhon数据分析A股股票策略实际买卖总结(每月末更新数据)

简介 本篇文章主要记录python数据分析a股股票选股后实际买卖的记录。 选股策略 低位寻股&#xff0c;筛选出低位股价股票已经做过调整的股票&#xff0c;做短线交易&#xff08;不超过7天&#xff09;&#xff0c;不贪&#xff0c;小赚即走。分三个时段&#xff0c;开盘三十…

SSM企业风向管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 企业风向管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库 &#xff0c;系统主要采用B/…

决策树(第四周)

一、决策树基本原理 如下图所示&#xff0c;是一个用来辨别是否是猫的二分类器。输入值有三个&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;&#xff08;耳朵形状&#xff0c;脸形状&#xff0c;胡须&#xff09;&#xff0c;其中x1{尖的&#xff0c;圆的}&#xf…

***利用SecureCRT上传、下载文件(使用sz与rz命令)

使用SecureCrt连接到服务器。 1、上传文件&#xff1a;rz命令 输入“rz”&#xff0c;回车&#xff0c;在弹窗的文件选择框中选择本地磁盘中需要上传的文件&#xff0c;点击【Add】按钮&#xff0c;再点击传输指令即可。 注意&#xff08;如果没有权限不可能成功&#xff0c;…

Runloop解析

RunLoop 前言 ​ 本文介绍RunLoop的概念&#xff0c;并使用swift和Objective-C来描述RunLoop机制。 简介 ​ RunLoop——运行循环&#xff08;死循环&#xff09;&#xff0c;它提供了一个事件循环机制在程序运行过程中处理各种事件&#xff0c;例如用户交互、网络请求、定…

ps5ps4游戏室如何计时?计费系统怎么查看游戏时间以及收费如何管理

ps5ps4游戏室如何计时&#xff1f;计费系统怎么查看游戏时间以及收费如何管理 1、ps5ps4游戏室如何计时&#xff1f; 下图以佳易王计时计费软件V17.9为例说明 在开始计时的时候&#xff0c;只需点 开始计时按钮&#xff0c;那么开台时间和使用的时间长度项目显示在屏幕上&am…

Pure-Pursuit 跟踪五次多项式轨迹

Pure-Pursuit 跟踪五次多项式轨迹 考虑双移线轨迹 X 轴方向位移较大&#xff0c;机械楼停车场长度无法满足 100 ~ 120 m&#xff0c;因此采用五次多项式进行轨迹规划&#xff0c;在轨迹跟踪部分也能水一些内容 调整 double_lane.cpp 为 ref_lane.cpp&#xff0c;结合 FrenetP…

基于 GPS 定位信息的 Pure-Pursuit 轨迹跟踪实车测试(1)

基于 GPS 定位信息的 Pure-Pursuit 轨迹跟踪实车测试&#xff08;1&#xff09; 进行了多组实验&#xff0c;包括顺逆时针转向&#xff0c;直线圆弧轨迹行驶&#xff0c;以及Pure-Pursuit 轨迹跟踪测试 代码修改 需要修改的代码并不多&#xff0c;主要对 gps_sensor 功能包和…

蓝桥杯每日一题2023.11.26

题目描述 奖券数目 - 蓝桥云课 (lanqiao.cn) 将每一个数字进行一一枚举&#xff0c;如果检查时不带有数字4则答案可以加1 #include<bits/stdc.h> using namespace std; int ans; bool check(int n) {while(n){if(n % 10 4)return false;n / 10; }return true; } int m…

基于Haclon的标签旋转项目案例

项目要求&#xff1a; 图为HALCON附图“25interleaved_exposure_04”&#xff0c;里面为旋转的二维码标签&#xff0c;请将其旋转到水平位置。 项目知识&#xff1a; 在HALCON中进行图像平移和旋转通常有以下步骤&#xff1a; &#xff08;1&#xff09;通过hom_mat2d_ident…

<JavaEE> Thread线程类 和 Thread的常用方法

目录 一、Thread概述 二、构造方法 三、常用方法 1.1 getId()、getName()、getState()、getPririty() 1.2 start() 1.3 isDaemon()、setDaemon() 1.4 isAlive() 1.5 currentThread() 1.6 Interrupt()、interrupted()、isInterrupted() 1.6.1 方法一&#xff1a;添加共…

基于Haclon的图形镜像案例

项目要求&#xff1a; 图为HALCON的例图“green-dot”&#xff0c;请将其中的圆形图案按水平和垂直两个方向分别进行镜像。 项目知识&#xff1a; 首先要用BLOB分析的方法&#xff0c;得到圆形图案的目标区域&#xff0c;再对其进行镜像。 在HALCON中与镜像相关的算子为mirr…

跟着chatgpt学习|1.spark入门

首先先让chatgpt帮我规划学习路径&#xff0c;使用Markdown格式返回&#xff0c;并转成思维导图的形式 目录 目录 1. 了解spark 1.1 Spark的概念 1.2 Spark的架构 1.3 Spark的基本功能 2.spark中的数据抽象和操作方式 2.1.RDD&#xff08;弹性分布式数据集&#xff09; 2…

实战oj题——括号匹配问题

前言&#xff1a;前面我们已经做了一些关于顺序表和链表的oj题&#xff0c;今天我们就来解决一些有关于栈和队列的oj题。 我们对这个题看起来毫无头绪&#xff0c;但是我们刚学习了栈&#xff0c;就可以用栈来解决这一类问题&#xff0c;如果我们读取到左括号就入栈&#xff0c…

Cache学习(3):Cache地址映射(直接映射缓存组相连缓存全相连缓存)

1 Cache的与存储地址的映射 以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组&#xff0c;数组总共8个元素&#xff0c;每个元素大小是 16 Bytes&#xff0c;如下图&#xff1a; 现在考虑一个问题&#xff0c;CPU从0x0654…

再见 Pandas,再见算法

大家好,《再见pandas》 系列已有200多位朋友加入学习了,这段时间亲眼见证了很多朋友的飞跃进步,从无到有,从一个问问题的小白到开始慢慢回答别人的问题,在讨论和练习中不断成长。虽说pandas已经很普及了,但普及内容的深度却远远不够。 下面这套原创图文是我和几位小伙伴…