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 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了——全自动填表的半自动人工智障。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习【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 …

webshell之内置函数免杀

原始webshell 查杀的点在于Runtime.getRuntime().exec非常明显的特征 利用ProcessBuilder替换Runtime.getRuntime().exec(cmd) Runtime.getRuntime().exec(cmd)其实最终调用的是ProcessBuilder这个函数,因此我们可以直接利用ProcessBuilder来替换Runtime.getRunti…

梯度详解与优化实战

什么是梯度 对所有自变量求偏微分构成的向量,它是一个向量(有大小和函数值增长方向) 导数是一个标量 找最小值点坐标的案例 import torchimport numpy as np import matplotlib.pyplot as plt def himmelblau(x):return (x[0]**2x[1]-11)…

再见 Pandas,再见算法

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

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

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

服务号和订阅号哪个好

服务号和订阅号有什么区别?服务号转为订阅号有哪些作用?在推送频率上来看,服务号每月能推送四条消息,而订阅号可以每天(24小时)推送一条消息。如果企业开通公众号的目的是提供服务,例如售前资讯…

Scannet v2 数据集介绍以及子集下载展示

Scannet v2 数据集介绍以及子集下载展示 文章目录 Scannet v2 数据集介绍以及子集下载展示参考数据集简介子集scannet_frames_25kscannet_frames_test 下载脚本 download_scannetv2.py 参考 scannet数据集简介和下载-CSDN博客 scannet v2 数据集下载_scannetv2数据集_蓝羽飞鸟的…

深入探索Linux文件系统:属性、路径与隐藏之谜

🎥 屿小夏 : 个人主页 🔥个人专栏 : Linux系统理论 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言🌤️文件的组成☁️文件属性☁️文件内容☁️注意事项 🌤️路…

自动化测试-Selenium

一. Selenium介绍 selenium 是用来做web自动化测试的框架,支持各种浏览器,各种,支持各种语言 原理: 二. 元素定位 2.1 XPath 定位 绝对路径: /html/head/title 相对路径以双斜杠开头,常见的相对路径定位有以下几种: <1>相对路径索引: 索引是从1开始的 <2>相…

GIS入门,开源 JavaScript二维地图引擎OpenLayers介绍

VueOpenLayers中文教程推荐&#xff0c;不同于OpenLayers官方文档使用htmljs原生原生教程&#xff0c;博主专栏包含大量vue整合案例和实际开发案例&#xff0c;非常适合地图开发小白快速入门。 vue整合OpenLayers6入门教程&#xff1a; 《VueOpenLayers入门教程汇总目录》vue整…

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

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

Proteus仿真--基于数码管显示的频率计设计

本文介绍基于数码管的频率计设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中80C51单片机作为主控&#xff0c;用数码管作为显示模块&#xff0c;按下按键K1后可进行频率测量并显示 仿真运行视频 Proteus仿真--数码管显示的频率计 附完整Pro…

Vue + Element UI 实现复制当前行数据功能及解决复制到新增页面组件值不更新的问题

文章目录 引言第一部分&#xff1a;复制当前行数据功能的实现1.1 环境准备1.2 创建表格并渲染数据1.3 解决复制的数据不更新问题 第二部分&#xff1a;拓展知识2.1 Vue的响应性原理2.2 Element UI的更多用法 结语 Vue Element UI 实现复制当前行数据功能及解决复制到新增页面组…

「C++」入门

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;C启航 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 文章目录 &#x1f349;前言&#x1f349;命名空间&#x1f34c;访问命名空间中的元素&#x1f34c;同名命名空间&#x1f34c;展开&…

SAP smartforms二维码输出

此方法需要SAP_BASIS版本在731以上 TCODE-SE73 选择’系统条形码’点击 ‘更改’ 按步骤创建一个系统条形码 Module Size 调节二维码的尺寸 进入smartforms 创建样式 填入条形码名称 创建一张表单测试二维码&#xff0c;填入创建好的样式 测试结果&#xff1a;

显示器校准软件BetterDisplay Pro mac中文版介绍

BetterDisplay Pro mac是一款显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 BetterDisplay Pro mac软件特点 - 显示器校准&#xff1a;可以根据不同的需求和环境条件调整显示器的颜色、亮度和对比度等参数…

Ansible的重用(include和import)

环境 管理节点&#xff1a;Ubuntu 22.04控制节点&#xff1a;CentOS 8Ansible&#xff1a;2.15.6 重用 Ansible提供四种可重用的工件&#xff1a; variable文件&#xff1a;只包含变量的文件task文件&#xff1a;只包含task的文件playbook&#xff1a;可包含play、变量、ta…

***Linux常用命令及解释

1、查看Linux的版本信息 1.1、uname -a 1.2、cat /etc/issue 1.3、cat /proc/version 1.4、hostnamectl 通过使用hostnamectl命令&#xff0c;可以查询和更改系统主机名&#xff0c;并且还可以查看Linux的发行版和内核版本。 2、删除文件 3、修改目录权限 4、解压文件 5、…

vue3(二)-基础入门

一、列表渲染 of 和 in 都是一样的效果 html代码&#xff1a; <div id"app"><ul><li v-for"item of datalist">{{ item }}</li></ul><ul><li v-for"item in dataobj">{{ item }}</li></u…

【教学类-06-10】20231125(55格版)X-Y之间“乘法×题”(以1-9乘法口诀表为例)(随机抽取和正序抽取)

图片展示 &#xff08;随机打乱排序&#xff09; 正序&#xff08;每张都一样&#xff09; 背景需求&#xff1a; 2023年11月24日&#xff0c;准备了一些题目&#xff0c;分别给大4班孩子介绍“5以内加法、5以内减法、5以内加减混合”““10以内加法、10以内减法、10以内加减…