C# 模拟浏览器并自动操作
程序员文章站
2023-11-14 13:36:16
本文主要讲解通过WebBrowser控件打开页面,并自动输入实现搜索功能,仅供学习分享使用,如有不足之处,还请指正。 ......
本文主要讲解通过webbrowser控件打开浏览页面,并操作页面元素实现自动搜索功能,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点
- webbrowser:用于在winform窗体中,模拟浏览器,打开并导航网页。
- htmldocument:表示一个html文档的页面。每次加载都会是一个全新的页面。
- getelementbyid(string id):通过id或name获取一个html中的元素。
- htmlelement:表示一个html标签元素。
- backgroundworker 后台执行独立操作的进程。
设计思路
主要采用异步等待的方式,等待页面加载完成,流程如下所示:
示例效果图
如下所示:加载完成后,自动输入【*】并点击搜索。
核心代码
加载新的页面,如下所示:
1 string url = "https://www.so.com/"; 2 this.wb01.scripterrorssuppressed = true; 3 this.wb01.navigate(url);
注意:this.wb01.scripterrorssuppressed = true;用于是否弹出异常脚本代码错误框
获取元素并赋值,如下所示:
1 string search_id = "input"; 2 string search_value = "*"; 3 string btn_id = "search-button"; 4 htmldocument doc = this.wb01.document; 5 htmlelement search = doc.getelementbyid(search_id); 6 search.setattribute("value", search_value); 7 htmlelement btn = doc.getelementbyid(btn_id); 8 btn.invokemember("click");
示例整体代码,如下所示:
1 using system; 2 using system.collections.generic; 3 using system.componentmodel; 4 using system.data; 5 using system.drawing; 6 using system.linq; 7 using system.text; 8 using system.threading; 9 using system.threading.tasks; 10 using system.windows.forms; 11 12 namespace demoexplorer 13 { 14 public partial class frmexplorer : form 15 { 16 private bool isloadok = false; 17 18 private backgroundworker bgwork; 19 20 public frmexplorer() 21 { 22 initializecomponent(); 23 } 24 25 private void frmexplorer_load(object sender, eventargs e) 26 { 27 bgwork = new backgroundworker(); 28 bgwork.dowork += bgwork_dowork; 29 bgwork.runworkercompleted += bgwork_runworkercompleted; 30 string url = "https://www.so.com/"; 31 this.wb01.scripterrorssuppressed = true; 32 this.wb01.navigate(url); 33 bgwork.runworkerasync(); 34 } 35 36 private void bgwork_runworkercompleted(object sender, runworkercompletedeventargs e) 37 { 38 string search_id = "input"; 39 string search_value = "*"; 40 string btn_id = "search-button"; 41 htmldocument doc = this.wb01.document; 42 htmlelement search = doc.getelementbyid(search_id); 43 search.setattribute("value", search_value); 44 htmlelement btn = doc.getelementbyid(btn_id); 45 btn.invokemember("click"); 46 } 47 48 private void bgwork_dowork(object sender, doworkeventargs e) 49 { 50 compwait(); 51 } 52 53 private void compwait() 54 { 55 while (!isloadok) 56 { 57 thread.sleep(500); 58 } 59 } 60 61 private void wb01_documentcompleted(object sender, webbrowserdocumentcompletedeventargs e) 62 { 63 this.wb01.document.window.error += new htmlelementerroreventhandler(window_error); 64 if (this.wb01.readystate == webbrowserreadystate.complete) 65 { 66 isloadok = true; 67 } 68 else 69 { 70 isloadok = false; 71 } 72 } 73 74 private void window_error(object sender, htmlelementerroreventargs e) 75 { 76 e.handled = true; 77 } 78 } 79 }
备注
所谓的坚持,不过是每天努力一点点!!!
上一篇: 如何为.NETCore安装汉化包智能感知