日韩精品亚洲精品中文字幕乱伦AV|曰韩区二区三区日韩中文字幕五码|ady99久久人人看人人摸人人|动漫一区二区黄99精品视频在线|AV片在线观看亚洲中文国产精品|伦乱在线VA欧美性爱一二区|亚洲无码mv91热色视频|激情六月综合欧美精品中文

當(dāng)前位置:首頁(yè) > 網(wǎng)站建設(shè) > 正文內(nèi)容

htmlspanurl(htmlspan標(biāo)簽)

網(wǎng)站建設(shè)10個(gè)月前 (04-04)397

概述

Selenium是一款免費(fèi)的分布式的自動(dòng)化測(cè)試工具,支持多種開(kāi)發(fā)語(yǔ)言,無(wú)論是C、 java、ruby、python、或是C# ,你都可以通過(guò)selenium完成自動(dòng)化測(cè)試。本文以一個(gè)簡(jiǎn)單的小例子,簡(jiǎn)述C# 利用Selenium進(jìn)行瀏覽器的模擬操作,僅供學(xué)習(xí)分享使用,如有不足之處,還請(qǐng)指正。

涉及知識(shí)點(diǎn)

要實(shí)現(xiàn)本例的功能,除了要掌握Html ,Java,CSS等基礎(chǔ)知識(shí),還涉及以下知識(shí)點(diǎn):

log4net:主要用于日志的記錄和存儲(chǔ),本例采用log4net進(jìn)行日志記錄,便于過(guò)程跟蹤和問(wèn)題排查,關(guān)于log4net的配置和介紹,之前已有說(shuō)明,本文不做贅述。

Queue:隊(duì)列,先進(jìn)先出模式,本文主要用于將日志信息保存于隊(duì)列中,然后再顯示到頁(yè)面上,其中Enqueue用于添加內(nèi)容到結(jié)尾處,Dequeue用于返回并移除一個(gè)位置的對(duì)象。

IWebDriver:瀏覽器驅(qū)動(dòng)接口,所有的關(guān)于瀏覽器的操作都可以通過(guò)此接口進(jìn)行,不同瀏覽器有不同的實(shí)現(xiàn)類,如:IE瀏覽器(InternetExplorerDriver)Chrome瀏覽器(ChromeDriver)等。

BackgroundWorker:后臺(tái)工作線程,區(qū)別于主線程,通過(guò)事件觸發(fā)不同的狀態(tài)。

本例開(kāi)發(fā)工具為VS2019,通過(guò)NuGet進(jìn)行需要的軟件包的安裝與管理,如下所示:

示例效果圖

本例采用Chrome瀏覽器,用于監(jiān)控某一個(gè)網(wǎng)站并獲取相應(yīng)內(nèi)容,如下所示:

展開(kāi)全文

Selenium示例介紹

定義一個(gè)webDriver,如下所示:

通過(guò)ID獲取元素并填充內(nèi)容和觸發(fā)事件,如下所示:

通過(guò)XPath獲取元素,如下所示:

核心代碼

主要的核心代碼,就是瀏覽器的元素定位查找和事件觸發(fā),如下所示:

namespaceAiSmoking.Core{publicclassSmoking{///summary///是否正在運(yùn)行 ////summaryprivateboolrunning = false;

///summary///驅(qū)動(dòng) ////summaryprivateIWebDriver driver = null;

///summary///# 無(wú)貨 ////summaryprivatestringno_stock = "Currently Out of Stock";

///summary///# 線程等待秒數(shù) ////summaryprivateintwait_sec = 2;

privateDictionary string, string cfg_info;

privatestringwork_path = string.Empty;

///summary///構(gòu)造函數(shù) ////summarypublicSmoking( ) {

}

///summary///帶參構(gòu)造函數(shù) ////summary///param name="cfg_info"/param///param name="work_path"/parampublicSmoking( 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///開(kāi)始跑 ////summarypublicvoidstartRun( ) {//"""運(yùn)行起來(lái)"""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( "配置信息不全,請(qǐng)檢查config.cfg文件是否為空,然后再重啟"); return; }if( this.driver == null) {stringexplorer = this.cfg_info[ "explorer"]; if(explorer == "Chrome") {//谷歌瀏覽器ChromeOptions options = newChromeOptions; this.driver = newChromeDriver(options); }else{//默認(rèn)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. 定義瀏覽器驅(qū)動(dòng)對(duì)象this.driver = newInternetExplorerDriver(options); }}this.run(url, username, password, item_id); }catch(Exception e) {LogHelper.put( "運(yùn)行過(guò)程中出錯(cuò),請(qǐng)重新打開(kāi)再試"+e.StackTrace); }}

htmlspanurl(htmlspan標(biāo)簽)

///summary///運(yùn)行 ////summary///param name="url"/param///param name="username"/param///param name="password"/param///param name="item_id"/paramprivatevoidrun( stringurl, stringusername, stringpassword, stringitem_id ) {//"""運(yùn)行起來(lái)"""http://# 3. 訪問(wèn)網(wǎng)站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( "歡迎回來(lái)"))) {//# 判斷是否登錄:已登錄LogHelper.put( "登錄成功,下一步開(kāi)始工作了"); this.working(item_id); }else{LogHelper.put( "登錄失敗,請(qǐng)?jiān)O(shè)置賬號(hào)密碼"); }}

///summary///停止運(yùn)行 ////summarypublicvoidstopRun( ) {//"""停止"""try{this.running = false; //# 如果驅(qū)動(dòng)不為空,則關(guān)閉//self.close_browser_nicely(self.__driver)if( this.driver != null) {this.driver.Quit; //# 關(guān)閉后切要為None,否則啟動(dòng)報(bào)錯(cuò)this.driver = null; }}catch(Exception e) {//print('Stop Failure')}finally{this.driver = null; }}

privatevoidlogin( stringusername, stringpassword ) {//# 5. 點(diǎn)擊鏈接跳轉(zhuǎn)到登錄頁(yè)面this.driver.FindElement(By.LinkText( "賬戶登錄")).Click; //# 6. 輸入賬號(hào)密碼//# 判斷是否加載完成if( this.checkIsExists(By.Id( "email"))) {this.driver.FindElement(By.Id( "email")).SendKeys(username); this.driver.FindElement(By.Id( "password")).SendKeys(password); //# 7. 點(diǎn)擊登錄按鈕this.driver.FindElement(By.Id( "sign-in")).Click; }}

///summary///工作狀態(tài) ////summary///param name="item_id"/paramprivatevoidworking( 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 = "http://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( "沒(méi)有查詢到item id ="+ item_id + "對(duì)應(yīng)的信息"); continue; }}else{Thread.Sleep( this.wait_sec); LogHelper.put( "沒(méi)有查詢到item id2 ="+ item_id + "對(duì)應(yīng)的信息"); continue; }//# 判斷當(dāng)前庫(kù)存是否有貨

stringxpath1 = "http://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) {//# 當(dāng)前無(wú)貨Thread.Sleep( this.wait_sec); LogHelper.put( "查詢一次"+ item_id + ",無(wú)貨"); continue; }}//# 鏈接path1stringxpath2 = "http://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); //# 加入購(gòu)物車if( this.checkIsExists(By.ClassName( "add-to-cart"))) {this.driver.FindElement(By.ClassName( "add-to-cart")).Click; LogHelper.put( "加入購(gòu)物車成功,商品item-id:"+ item_id); break; }else{LogHelper.put( "未找到加入購(gòu)物車按鈕"); }}else{LogHelper.put( "沒(méi)有查詢到,可能是商品編碼不對(duì),或者已下架"); }Thread.Sleep( this.wait_sec); }catch(Exception e) {Thread.Sleep( this.wait_sec); LogHelper.put(e);}}}

///summary///判斷是否存在 ////summary///param name="by"/param///returns/returnsprivateboolcheckIsExists( 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; }}

}}

關(guān)于日志幫助類,代碼如下:

備注

行路難·其一

【作者】李白 【朝代】唐

金樽清酒斗十千,玉盤(pán)珍羞直萬(wàn)錢。

停杯投箸不能食,拔劍四顧心茫然。

欲渡黃河冰塞川,將登太行雪滿山。

閑來(lái)垂釣碧溪上,忽復(fù)乘舟夢(mèng)日邊。

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

長(zhǎng)風(fēng)破浪會(huì)有時(shí),直掛云帆濟(jì)滄海。

作者:Alan.hsiang

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

版權(quán)聲明:本文來(lái)源于網(wǎng)友收集或網(wǎng)友供稿,僅供學(xué)習(xí)交流之用,如果有侵權(quán),請(qǐng)轉(zhuǎn)告小編或者留言,本公眾號(hào)立即刪除。

支持小薇

福利 :

關(guān)注公眾號(hào): DotNet開(kāi)發(fā)跳槽 ?

覺(jué)得不錯(cuò),請(qǐng)點(diǎn)個(gè)在看 呀

掃描二維碼推送至手機(jī)訪問(wèn)。

版權(quán)聲明:本文由飛速云SEO網(wǎng)絡(luò)優(yōu)化推廣發(fā)布,如需轉(zhuǎn)載請(qǐng)注明出處。

本文鏈接:http://m.atlasseeker.com/post/102638.html

標(biāo)簽: htmlspanurl

“htmlspanurl(htmlspan標(biāo)簽)” 的相關(guān)文章

網(wǎng)站優(yōu)化排名(百度網(wǎng)站優(yōu)化排名)

網(wǎng)站優(yōu)化排名(百度網(wǎng)站優(yōu)化排名)

本篇文章給大家談?wù)劸W(wǎng)站優(yōu)化排名,以及百度網(wǎng)站優(yōu)化排名對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、網(wǎng)站優(yōu)化排名公司 2、網(wǎng)站如何優(yōu)化排名軟件 3、seo怎么優(yōu)化網(wǎng)站排名 4、網(wǎng)站優(yōu)化排名 5、網(wǎng)站排名優(yōu)化 網(wǎng)站優(yōu)化排名公司 網(wǎng)站優(yōu)化排名公司:云無(wú)限、帝...

包含黃岡網(wǎng)站建設(shè)的詞條

包含黃岡網(wǎng)站建設(shè)的詞條

今天給各位分享黃岡網(wǎng)站建設(shè)的知識(shí),其中也會(huì)對(duì)進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、網(wǎng)站建設(shè)哪家好?怎樣才算好 2、黃岡市5G網(wǎng)站建設(shè)現(xiàn)在進(jìn)行了嗎? 3、黃岡網(wǎng)站制作哪家公司好? 4、您好,我求助一下網(wǎng)站建設(shè)的問(wèn)題 網(wǎng)站建設(shè)哪家好?怎樣...

廊坊網(wǎng)站制作(廊坊網(wǎng)站專業(yè)制作)

廊坊網(wǎng)站制作(廊坊網(wǎng)站專業(yè)制作)

今天給各位分享廊坊網(wǎng)站制作的知識(shí),其中也會(huì)對(duì)廊坊網(wǎng)站專業(yè)制作進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、廊坊的話,做網(wǎng)站建設(shè)哪家公司比較正規(guī)? 2、廊坊有軟件開(kāi)發(fā)跟網(wǎng)站建設(shè)的公司嗎? 3、廊坊企業(yè)模版建站哪里的好 4、負(fù)責(zé)廊坊公司企業(yè)網(wǎng)站建設(shè)...

2022個(gè)人簡(jiǎn)歷模板免費(fèi)(2021簡(jiǎn)歷模板免費(fèi))

2022個(gè)人簡(jiǎn)歷模板免費(fèi)(2021簡(jiǎn)歷模板免費(fèi))

本篇文章給大家談?wù)?022個(gè)人簡(jiǎn)歷模板免費(fèi),以及2021簡(jiǎn)歷模板免費(fèi)對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、2022個(gè)人簡(jiǎn)歷中的格式 2、2022文員個(gè)人簡(jiǎn)歷模板 3、簡(jiǎn)單版2022個(gè)人簡(jiǎn)歷模板 2022個(gè)人簡(jiǎn)歷中的格式 ? ? 如何能制作出一份成功...

打印機(jī)標(biāo)簽?zāi)0逶O(shè)置系統(tǒng)(打印標(biāo)簽?zāi)0逶趺丛O(shè)置)

打印機(jī)標(biāo)簽?zāi)0逶O(shè)置系統(tǒng)(打印標(biāo)簽?zāi)0逶趺丛O(shè)置)

今天給各位分享打印機(jī)標(biāo)簽?zāi)0逶O(shè)置系統(tǒng)的知識(shí),其中也會(huì)對(duì)打印標(biāo)簽?zāi)0逶趺丛O(shè)置進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開(kāi)始吧!本文目錄一覽: 1、xprinter打印機(jī)怎么設(shè)置模板 2、芯華熱敏打印機(jī)怎么設(shè)置打印模板 3、標(biāo)簽打印機(jī)怎么設(shè)置標(biāo)簽?zāi)0澹?4、佳博條碼標(biāo)簽打...

計(jì)算機(jī)職業(yè)生涯規(guī)劃書(shū)word模板(計(jì)算機(jī)系職業(yè)生涯規(guī)劃書(shū))

計(jì)算機(jī)職業(yè)生涯規(guī)劃書(shū)word模板(計(jì)算機(jī)系職業(yè)生涯規(guī)劃書(shū))

本篇文章給大家談?wù)動(dòng)?jì)算機(jī)職業(yè)生涯規(guī)劃書(shū)word模板,以及計(jì)算機(jī)系職業(yè)生涯規(guī)劃書(shū)對(duì)應(yīng)的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。 本文目錄一覽: 1、計(jì)算機(jī)專業(yè)職業(yè)規(guī)劃書(shū) 2、計(jì)算機(jī)職業(yè)生涯規(guī)劃書(shū)(職高) 3、簡(jiǎn)短大學(xué)生職業(yè)生涯規(guī)劃書(shū)標(biāo)準(zhǔn)版5篇 4、計(jì)算機(jī)類“職業(yè)生涯規(guī)劃書(shū)”1500...