C# 模拟浏览器自操作(自动化办公)

使用WebBrowser加载网页(内嵌)

通过WebBrowser控件打开浏览页面,并操作页面元素实现自动搜索功能

        //是否已经加载网页标准private bool isLoadok = false;//首次加载网页标准private bool firstLoaded = false;//后台服务private BackgroundWorker bgwork;public WebBrowserDemo(){InitializeComponent();}/// <summary>/// 自动窗体后加载网页并获取网络元素,实现赋值,点击操作/// winform窗体上添加了一个名为webBrowser1的WebBrowser控件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){this.BeginInvoke(new Action(() =>{bgwork = new BackgroundWorker();bgwork.DoWork += Bgwork_DoWork;bgwork.RunWorkerCompleted += Bgwork_RunWorkerCompleted;string url = "https://www.so.com/";this.webBrowser1.ScriptErrorsSuppressed = true;this.webBrowser1.Navigate(url);webBrowser1.DocumentCompleted += WebBrowser1_DocumentCompleted;bgwork.RunWorkerAsync();判断网页是否加载完成:等待不起作用,一直在加载网页,使用DocumentCompleted事件//while (this.webBrowser1.IsBusy || webBrowser1.ReadyState != WebBrowserReadyState.Complete)//{//    Thread.Sleep(1000);//}//string search_id = "input";//string search_value = "天安门";//string btn_id = "search-button";//HtmlDocument doc = this.webBrowser1.Document;//HtmlElement search = doc.GetElementById(search_id);//search.SetAttribute("value", search_value);//HtmlElement btn = doc.GetElementById(btn_id);//btn.InvokeMember("click");}));}/// <summary>/// WebBrowser加载网页完成事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){this.BeginInvoke(new Action(() =>{if (this.webBrowser1.IsBusy == false && webBrowser1.ReadyState == WebBrowserReadyState.Complete&& firstLoaded==false){firstLoaded=true;string search_id = "input";string search_value = "自动化";string btn_id = "search-button";HtmlDocument doc = this.webBrowser1.Document;HtmlElement search = doc.GetElementById(search_id);search.SetAttribute("value", search_value);HtmlElement btn = doc.GetElementById(btn_id);btn.InvokeMember("click");}}));}/// <summary>/// 后台服务完成事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Bgwork_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){this.webBrowser1.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error);if(webBrowser1.ReadyState == WebBrowserReadyState.Complete){isLoadok = true;}else{isLoadok = false;}}/// <summary>/// 加载网页错误事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Window_Error(object sender, HtmlElementErrorEventArgs e){e.Handled = true;}/// <summary>/// 后台服务/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Bgwork_DoWork(object sender, DoWorkEventArgs e){compWait();}/// <summary>/// 后台服务方法/// </summary>private void compWait(){while(!isLoadok){Thread.Sleep(500);}}

使用 Selenium WebDriver加载网页(独立)

Selenium WebDriver 是一个基于 Web 的自动化测试框架,可以测试在各种Web浏览器和各种操作系统上启动的网页。可以自由使用各种编程语言(例如Java、Perl、Python、Ruby、C#、PHP 和 JavaScript)编写测试脚本。注:可以不需要下载webdriver驱动

    private void btnLoad_Click(object sender, EventArgs e){// 设置Chrome选项,可选var options = new ChromeOptions();//options.AddArgument("--headless"); // 无头模式,不打开浏览器窗口// 初始化WebDriverIWebDriver driver = new ChromeDriver(options);try{// 打开网页driver.Navigate().GoToUrl("https://account.chsi.com.cn/passport/login");//driver.Navigate().Back();//driver.Navigate().Refresh();// 等待页面加载完成,知道页面空闲,超时10s抛出异常//var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));//wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.BrowserIsNotBusy());//查找用户输入框并输入用户名driver.FindElement(By.Name("username")).SendKeys("Tom");//查找密码输入框并输入密码driver.FindElement(By.Name("password")).SendKeys("123456");driver.Manage().Window.Maximize();查找提交按钮并点击提交按钮//driver.FindElement(By.ClassName("btn_login")).Click();// 获取页面源码string pageSource = driver.PageSource;Console.WriteLine(pageSource);}catch(Exception ex){Console.WriteLine(ex.Message);}finally{清理,关闭浏览器//driver.Quit();}}

实例连接:https://download.csdn.net/download/lvxingzhe3/89976966

参考资料:

C# 模拟浏览器并自动操作 - 老码识途呀 - 博客园

selenium的webdriver常用方法和属性介绍(2)_selenium webdriver-CSDN博客

ChromeDriver下载安装-CSDN博客

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

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

相关文章

Android Studio 将项目打包成apk文件

第一步&#xff1a;选择Build -> Generate Signed APK 会出现&#xff1a; 我们选择 Create new… 然后选择你要存放密钥的地方 点击ok之后&#xff0c;则选择好了文件&#xff0c;并生成了jks文件了。 点击ok之后&#xff0c; 会出现&#xff1a; 选择release&#xf…

【面试题】发起一次网络请求,当请求>=1s,立马中断

首先这是一个大厂的面试题&#xff0c;是我一个同事跟我说的&#xff0c;具体什么业务场景面试官没说&#xff0c;但我猜测可能是以下几种业务场景&#xff1a; 表单提交&#xff1a;在用户提交表单时&#xff0c;如果请求处理时间过长&#xff0c;可以中断请求并提示用户检查…

从0开始学习Linux——文件管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

MySQL系列之如何在Linux只安装客户端

导览 前言Q&#xff1a;如何安装一个Linux环境下的MySQL客户端一、准备文件1. 确认Server版本2. 选择Client安装文件 二、下载并安装1. 下载1.1 寻找文件1.2 文件说明 2. 安装2.1 上传至Linux服务器2.2 执行安装 三、连接验证1. 确认远程授权2. 建立远程连接 结语精彩回放 前言…

虚幻引擎 CEO 谈元宇宙:发展、策略与布局

在当今科技领域&#xff0c;元宇宙无疑是最热门的话题之一。Epic Games 首席执行官 Tim Sweeney 对元宇宙的未来发展充满信心&#xff0c;他认为开放元宇宙将融合娱乐、游戏和科技产业&#xff0c;带来一个光明的未来。本文将深入探讨采访中的关键内容&#xff0c;分析元宇宙的…

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据,LabVIEW 上位机绘制演化曲线

【R78/G15 开发板测评】串口打印 DHT11 温湿度传感器、DS18B20 温度传感器数据&#xff0c;LabVIEW 上位机绘制演化曲线 主要介绍了 R78/G15 开发板基于 Arduino IDE 环境串口打印温湿度传感器 DHT11 和温度传感器 DS18B20 传感器的数据&#xff0c;并通过LabVIEW上位机绘制演…

quartz

理论知识&#xff1a; 堆&#xff1a;堆是一颗安全二叉树&#xff0c;是一种特殊的树结构&#xff0c;它的每一个节点值都要比父节点要么大&#xff0c;要么小 小顶堆&#xff1a;最小的值放在最上面&#xff0c;每个子节点都比父节点大 大顶堆&#xff1a;最大的值放在最上…

提取神经网络数学表达式

来自《老饼讲解神经网络》 www..bbbdata.com 当我们在matlab训练好网络后&#xff0c;可以使用神经网络工具箱的sim(net,x)函数进行预测输出。但往往想提取出它的数学表达式&#xff0c;该怎么提取呢&#xff1f; 下面以《一个简单的神经网络例子》中的模型为例&#xff0c;提取…

Vue 的生命周期函数 和 Vuex

创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的&#xff1a; var vm new Vue({// 选项 })虽然没有完全遵循 MVVM 模型&#xff0c;但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实…

使用etl工具kettle的日常踩坑梳理之二、从Hadoop中导出数据

想操作MySQL等关系型数据库的可以访问我上一篇文章&#xff0c;本章主要介绍操作Hadoop等大数据组件。 根据2024年11月份测试了kettle工具在9.3及以上版本已经没有内置连接大数据(如Hadoop)组件了。 建议安装9.2及以下的&#xff0c;我这里送上8.3.0版本的请用百度网盘下载链…

新版 idea 编写 idea 插件时,启动出现 ClassNotFound

IntelliJ IDEA 2024.1.6 (Ultimate Edition) Build #IU-241.19072.14, built on August 8, 2024 Licensed to Sophia Tout Subscription is active until June 29, 2025. For educational use only. Runtime version: 17.0.111-b1207.30 amd64 Kotlin: 241.19072.14-IJ 新版本…

Java面向对象编程进阶之包装类

Java面向对象编程进阶之包装类 一、为什么要使用包装类二、掌握基本数据类型与包装类之间的转换1、为什么需要转换&#xff1f;2、如何转换&#xff1f; 三、String与基本数据类型、包装类之间的转换1、案例2、特别注意 一、为什么要使用包装类 为了使得基本类型的数据变量具备…

【mysql】使用宝塔面板在云服务器上安装MySQL数据库并实现远程连接

前言 使用宝塔Linux面板安装MySQL数据库并实现远程连接 使用宝塔面板安装mysql 宝塔面板&#xff0c;华为云开放3306端口 一些命令 // 命令行连接数据库 mysql -uroot -p // MySQL 5 版本 GRANT ALL ON *.* TO root% IDENTIFIED BY 替换成你的root密码 WITH GRANT OPTION; // …

性能测试|JMeter接口与性能测试项目

前言 在软件开发和运维过程中&#xff0c;接口性能测试是一项至关重要的工作。JMeter作为一款开源的Java应用&#xff0c;被广泛用于进行各种性能测试&#xff0c;包括接口性能测试。本文将详细介绍如何使用JMeter进行接口性能测试的过程和步骤。 JMeter是Apache组织开发的基…

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…

应用于新能源汽车NCV4275CDT50RKG车规级LDO线性电压调节器芯片

关于车规级芯片&#xff08;Automotive Grade Chip&#xff09;&#xff0c;车规级芯片是专门用于汽车行业的芯片&#xff0c;具有高可靠性、高稳定性和低功耗等特点&#xff0c;以满足汽车电子系统的严格要求。这些芯片通常用于车载电子控制单元&#xff08;ECU&#xff09;和…

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议&#xff0c;和HTTP类似&#xff0c;因为轻量简单&…

【OH】openHarmony开发环境搭建(基于windows子系统WSL)

前言 本文主要介绍基于windows子系统WSL搭建openHarmony开发环境。 WSL与Vmware虚拟机的区别&#xff0c;可以查看WSL与虚拟机的区别 更详细的安装配置过程可参考微软官网&#xff1a; ​安装 WSL 前提 以下基于windows 111专业版进行配置&#xff0c;windows 10应该也是可以…

豆瓣均分9:不容错过的9本大模型入门宝藏书籍,非常详细收藏我这一篇就够了

在这个大模型风起云涌的时代&#xff0c;技术的边界被不断拓宽&#xff0c;AI的力量正以前所未有的方式重塑我们的世界。如果你渴望站在技术的浪尖&#xff0c;深入了解增强现实&#xff08;AR&#xff09;、机器学习&#xff08;ML&#xff09;与强化学习&#xff08;RL&#…

OCR识别铁路电子客票

随着中国铁路客运领域进入全面数字化时代&#xff0c;国家税务总局、财政部和国铁集团于2024年10月18日联合发布公告&#xff0c;自2024年11月1日起&#xff0c;推广使用“电子发票&#xff08;铁路电子客票&#xff09;”。这一举措不仅为旅客出行提供了极大的便利&#xff0c…