selenium停止网页加载(selenium暂停)

概述

Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C、 java、ruby、python、或是C# ,你都可以通过selenium完成自动化测试。本文以一个简单的小例子,简述C# 利用Selenium进行浏览器的模拟操作,仅供学习分享使用,如有不足之处,还请指正。

涉及知识点

要实现本例的功能,除了要掌握Html ,Java,CSS等基础知识,还涉及以下知识点:

log4net:主要用于日志的记录和存储,本例采用log4net进行日志记录,便于过程跟踪和问题排查,关于log4net的配置和介绍,之前已有说明,本文不做赘述。

Queue:队列,先进先出模式,本文主要用于将日志信息保存于队列中,然后再显示到页面上,其中Enqueue用于添加内容到结尾处,Dequeue用于返回并移除一个位置的对象。

IWebDriver:浏览器驱动接口,所有的关于浏览器的操作都可以通过此接口进行,不同浏览器有不同的实现类,如:IE浏览器(InternetExplorerDriver)Chrome浏览器(ChromeDriver)等。

selenium停止网页加载(selenium暂停),selenium停止网页加载(selenium暂停),selenium停止网页加载,信息,账号,浏览器,第1张

BackgroundWorker:后台工作线程,区别于主线程,通过事件触发不同的状态。

Selenium安装

本例开发工具为VS2019,通过NuGet进行需要的软件包的安装与管理,如下所示:

示例效果图

本例采用Chrome浏览器,用于监控某一个网站并获取相应内容,如下所示:

Selenium示例介绍

定义一个webDriver,如下所示:

//谷歌浏览器

ChromeOptions options = newChromeOptions;

this.driver = newChromeDriver(options);

通过ID获取元素并填充内容和触发事件,如下所示:

this.driver.FindElement(By.Id( "email")).SendKeys(username);

this.driver.FindElement(By.Id( "password")).SendKeys(password);

//# 7. 点击登录按钮

this.driver.FindElement(By.Id( "sign-in")).Click;

通过XPath获取元素,如下所示:

string xpath1 = "//div[@class=\"product-list\"]/div[@class=\"product\"]/div[@class=\"price-and-detail\"]/div[@class=\"price\"]/span[@class=\"noStock\"]";

string txt = this.driver.FindElement(By.XPath(xpath1)).Text;

核心代码

主要的核心代码,就是浏览器的元素定位查找和事件触发,如下所示:

usingOpenQA.Selenium;

usingOpenQA.Selenium.IE;

usingOpenQA.Selenium.Chrome;

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading;

usingSystem.Threading.Tasks;

namespaceAiSmoking.Core{publicclassSmoking{///<summary>///是否正在运行 ///</summary>privateboolrunning = false;

///<summary>///驱动 ///</summary>privateIWebDriver driver = null;

///<summary>///# 无货 ///</summary>privatestringno_stock = "Currently Out of Stock";

///<summary>///# 线程等待秒数 ///</summary>privateintwait_sec = 2;

privateDictionary< string, string> cfg_info;

privatestringwork_path = string.Empty;

///<summary>///构造函数 ///</summary>publicSmoking( ) {

}

///<summary>///带参构造函数 ///</summary>///<param name="cfg_info"></param>///<param name="work_path"></param>publicSmoking( Dictionary< string, string> cfg_info, stringwork_path ) {this.cfg_info = cfg_info; this.work_path = work_path; this.wait_sec = int.Parse(cfg_info[ "wait_sec"]); //# 如果小于2,则等于2this.wait_sec = ( this.wait_sec < 2? 2: this.wait_sec); this.wait_sec = this.wait_sec * 1000; }

///<summary>///开始跑 ///</summary>publicvoidstartRun( ) {//"""运行起来"""try{this.running = true; stringurl = this.cfg_info[ "url"]; stringusername = this.cfg_info[ "username"]; stringpassword = this.cfg_info[ "password"]; stringitem_id = this.cfg_info[ "item_id"]; if( string.IsNullOrEmpty(url) || string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || string.IsNullOrEmpty(item_id)) {LogHelper.put( "配置信息不全,请检查config.cfg文件是否为空,然后再重启"); return; }if( this.driver == null) {stringexplorer = this.cfg_info[ "explorer"]; if(explorer == "Chrome") {//谷歌浏览器ChromeOptions options = newChromeOptions; this.driver = newChromeDriver(options); }else{//默认IEvaroptions = newInternetExplorerOptions; //options.AddAdditionalCapability.('encoding=UTF-8')//options.add_argument('Accept= text / css, * / *')//options.add_argument('Accept - Language= zh - Hans - CN, zh - Hans;q = 0.5')//options.add_argument('Accept - Encoding= gzip, deflate')//options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko')//# 2. 定义浏览器驱动对象this.driver = newInternetExplorerDriver(options); }}this.run(url, username, password, item_id); }catch(Exception e) {LogHelper.put( "运行过程中出错,请重新打开再试"+e.StackTrace); }}

///<summary>///运行 ///</summary>///<param name="url"></param>///<param name="username"></param>///<param name="password"></param>///<param name="item_id"></param>privatevoidrun( stringurl, stringusername, stringpassword, stringitem_id ) {//"""运行起来"""//# 3. 访问网站this.driver.Navigate.GoToUrl(url); //# 4. 最大化窗口this.driver.Manage.Window.Maximize; if( this.checkIsExists(By.LinkText( "账户登录"))) {//# 判断是否登录:未登录this.login(username, password); }if( this.checkIsExists(By.PartialLinkText( "欢迎回来"))) {//# 判断是否登录:已登录LogHelper.put( "登录成功,下一步开始工作了"); this.working(item_id); }else{LogHelper.put( "登录失败,请设置账号密码"); }}

///<summary>///停止运行 ///</summary>publicvoidstopRun( ) {//"""停止"""try{this.running = false; //# 如果驱动不为空,则关闭//self.close_browser_nicely(self.__driver)if( this.driver != null) {this.driver.Quit; //# 关闭后切要为None,否则启动报错this.driver = null; }}catch(Exception e) {//print('Stop Failure')}finally{this.driver = null; }}

privatevoidlogin( stringusername, stringpassword ) {//# 5. 点击链接跳转到登录页面this.driver.FindElement(By.LinkText( "账户登录")).Click; //# 6. 输入账号密码//# 判断是否加载完成if( this.checkIsExists(By.Id( "email"))) {this.driver.FindElement(By.Id( "email")).SendKeys(username); this.driver.FindElement(By.Id( "password")).SendKeys(password); //# 7. 点击登录按钮this.driver.FindElement(By.Id( "sign-in")).Click; }}

///<summary>///工作状态 ///</summary>///<param name="item_id"></param>privatevoidworking( stringitem_id ) {while( this.running) {try{//# 正常获取信息if( this.checkIsExists(By.Id( "string"))) {this.driver.FindElement(By.Id( "string")).Clear; this.driver.FindElement(By.Id( "string")).SendKeys(item_id); this.driver.FindElement(By.Id( "string")).SendKeys(Keys.Enter); }//# 判断是否查询到商品stringxpath = "//div[@class=\"specialty-header search\"]/div[@class=\"specialty-deion\"]/div[@class=\"gt-450\"]/span[2] "; if( this.checkIsExists(By.XPath(xpath))) {intcount = int.Parse( this.driver.FindElement(By.XPath(xpath)).Text); if(count < 1) {Thread.Sleep( this.wait_sec); LogHelper.put( "没有查询到item id ="+ item_id + "对应的信息"); continue; }}else{Thread.Sleep( this.wait_sec); LogHelper.put( "没有查询到item id2 ="+ item_id + "对应的信息"); continue; }//# 判断当前库存是否有货

stringxpath1 = "//div[@class=\"product-list\"]/div[@class=\"product\"]/div[@class=\"price-and-detail\"]/div[@class=\"price\"]/span[@class=\"noStock\"]"; if( this.checkIsExists(By.XPath(xpath1))) {stringtxt = this.driver.FindElement(By.XPath(xpath1)).Text; if(txt == this.no_stock) {//# 当前无货Thread.Sleep( this.wait_sec); LogHelper.put( "查询一次"+ item_id + ",无货"); continue; }}//# 链接path1stringxpath2 = "//div[@class=\"product-list\"]/div[@class=\"product\"]/div[@class=\"imgDiv\"]/a"; //# 判断是否加载完毕//# this.waiting((By.CLASS_NAME, "imgDiv"))if( this.checkIsExists(By.XPath(xpath2))) {this.driver.FindElement(By.XPath(xpath2)).Click; Thread.Sleep( this.wait_sec); //# 加入购物车if( this.checkIsExists(By.ClassName( "add-to-cart"))) {this.driver.FindElement(By.ClassName( "add-to-cart")).Click; LogHelper.put( "加入购物车成功,商品item-id:"+ item_id); break; }else{LogHelper.put( "未找到加入购物车按钮"); }}else{LogHelper.put( "没有查询到,可能是商品编码不对,或者已下架"); }Thread.Sleep( this.wait_sec); }catch(Exception e) {Thread.Sleep( this.wait_sec); LogHelper.put(e);}}}

///<summary>///判断是否存在 ///</summary>///<param name="by"></param>///<returns></returns>privateboolcheckIsExists( By by) {try{inti = 0; while( this.running && i < 3) {if( this.driver.FindElements( by).Count > 0) {break; }else{Thread.Sleep( this.wait_sec); i = i + 1; }}returnthis.driver.FindElements( by).Count > 0; }catch(Exception e) {LogHelper.put(e);returnfalse; }}

}}

关于日志帮助类,代码如下:

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; usinglog4net; [ assembly: log4net.Config.XmlConfigurator(Watch = true)] namespaceAiSmoking.Core{///<summary>///日志帮助类 ///</summary>publicstaticclassLogHelper{///<summary>///日志实例 ///</summary>privatestaticILog logInstance = LogManager.GetLogger( "smoking"); privatestaticQueue< string> queue = newQueue< string>( 2000); publicstaticvoidput( stringmsg ) {queue.Enqueue(msg);WriteLog(msg, LogLevel.Info);}publicstaticvoidput( Exception ex) {WriteLog(ex.StackTrace, LogLevel.Error);}publicstaticstringget( ) {if(queue.Count > 0) {returnqueue.Dequeue; }else{returnstring.Empty; }}publicstaticvoidWriteLog( stringmessage, LogLevel level ) {switch(level) {caseLogLevel.Debug: logInstance.Debug(message);break; caseLogLevel.Error: logInstance.Error(message);break; caseLogLevel.Fatal: logInstance.Fatal(message);break; caseLogLevel.Info: logInstance.Info(message);break; caseLogLevel.Warn: logInstance.Warn(message);break; default: logInstance.Info(message);break; }}}publicenumLogLevel {Debug = 0, Error = 1, Fatal = 2, Info = 3, Warn = 4}}

备注

行路难·其一

【作者】李白 【朝代】唐

金樽清酒斗十千,玉盘珍羞直万钱。

停杯投箸不能食,拔剑四顾心茫然。

欲渡黄河冰塞川,将登太行雪满山。

闲来垂钓碧溪上,忽复乘舟梦日边。

行路难,行路难,多歧路,今安在?

长风破浪会有时,直挂云帆济沧海。

作者:Alan.hsiang

出处:http://www.cnblogs.com/hsiang/

版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本公众号立即删除。

支持小薇

福利 :

关注公众号: DotNet开发跳槽 ❀

觉得不错,请点个在看 呀


【免责声明】:

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

【关于转载】:

本站尊重互联网版权体系,本站部分图片、文章大部分转载于互联网、所有内容不代表本站观点、不对文章中的任何观点负责、转载的目的只用于给网民提供信息阅读,无任何商业用途,所有内容版权归原作者所有
如本站(文章、内容、图片、视频)任何资料有侵权,先说声抱歉;麻烦您请联系请后台提交工单,我们会立即删除、维护您的权益。非常感谢您的理解。

【附】:

二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!

注:本站资源来自网络转载,版权归原作者和公司所有,如果有侵犯到您的权益,请第一时间联系我们处理!

-----------------------------------------------------------------------------------------------------------

【版权声明】:

一、本站致力于为源码爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、如有内容侵犯您的版权或其他利益的,请编辑邮件并加以说明发送到站长邮箱。站长会进行审查之后,情况属实的会在三个工作日内为您删除。
-----------------------------------------------------------------------------------------------------------


内容投诉
源码村资源网 » selenium停止网页加载(selenium暂停)

1 评论

您需要 登录账户 后才能发表评论

发表评论

欢迎 访客 发表评论