Selenium是一款免费的分布式的自动化测试工具,支持多种开发语言,无论是C、 java、ruby、python、或是C# ,你都可以通过selenium完成自动化测试。本文以一个简单的小例子,简述C# 利用Selenium进行浏览器的模拟 *** 作,仅供学习分享使用,如有不足之处,还请指正。
涉及知识点要实现本例的功能,除了要掌握HTML ,JavaScript,CSS等基础知识,还涉及以下知识点:
log4net:主要用于日志的记录和存储,本例采用log4net进行日志记录,便于过程跟踪和问题排查,关于log4net的配置和介绍,之前已有说明,本文不做赘述。Queue:队列,先进先出模式,本文主要用于将日志信息保存于队列中,然后再显示到页面上,其中Enqueue用于添加内容到结尾处,Dequeue用于返回并移除一个位置的对象。IWebDriver:浏览器驱动接口,所有的关于浏览器的 *** 作都可以通过此接口进行,不同浏览器有不同的实现类,如:IE浏览器(InternetExplorerDriver)Chrome浏览器(ChromeDriver)等。BackgrounDWorker:后台工作线程,区别于主线程,通过事件触发不同的状态。Selenium安装本例开发工具为VS2019,通过NuGet进行需要的软件包的安装与管理,如下所示:
示例效果图本例采用Chrome浏览器,用于监控某一个网站并获取相应内容,如下所示:
Selenium示例介绍定义一个webDriver,如下所示:
1 //谷歌浏览器2 ChromeOptions options = new ChromeOptions();3 this.driver = new ChromeDriver(options);
通过ID获取元素并填充内容和触发事件,如下所示:
this.driver.FindElement(By.ID("email")).SendKeys(username);2 password)).SendKeys(password);# 7. 点击登录按钮4 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;核心代码
主要的核心代码,就是浏览器的元素定位查找和事件触发,如下所示:
1 using OpenQA.Selenium; 2 OpenQA.Selenium.IE; 3 OpenQA.Selenium.Chrome; 4 System; 5 System.Collections.Generic; 6 System.linq; 7 System.Text; 8 System.Threading; 9 System.Threading.Tasks; 10 11 namespace AiSmoking.Core 12 { 13 public class Smoking 14 { 15 /// <summary> 16 /// 是否正在运行 17 </summary> 18 private bool running = false 19 20 21 驱动 22 23 private IWebDriver driver = null 24 25 26 27 # 无货 28 29 string no_stock = Currently Out of Stock 30 31 32 33 # 线程等待秒数 34 35 int wait_sec = 2 36 37 private Dictionary<string,string> cfg_info; 38 39 string work_path = string.Empty; 40 41 42 构造函数 43 44 public Smoking() 45 { 46 47 } 48 49 50 带参构造函数 51 52 <param name="cfg_info"></param> 53 <param name="work_path"></param> 54 public Smoking(Dictionary<string> cfg_info,1)"> work_path) 55 56 this.cfg_info = 57 this.work_path = work_path; 58 this.wait_sec = int.Parse(cfg_info[wait_sec]); 59 # 如果小于2,则等于2 60 this.wait_sec = (this.wait_sec < 2 ? 2 : this.wait_sec); 61 this.wait_sec * 1000 62 63 64 65 开始跑 66 67 voID startRun() 68 69 """运行起来""" 70 try 71 { 72 this.running = true 73 string url = this.cfg_info[url]; 74 string username = username 75 string password = 76 string item_ID = item_ID 77 if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password) || .IsNullOrEmpty(item_ID)) 78 { 79 LogHelper.put(配置信息不全,请检查config.cfg文件是否为空,然后再重启); 80 return 81 } 82 this.driver == ) 83 84 string explorer = explorer 85 if (explorer == Chrome 86 { 87 88 ChromeOptions options = 89 ChromeDriver(options); 90 } 91 else 92 93 默认IE 94 var options = InternetExplorerOptions(); 95 options.AddAdditionalCapability.('enCoding=UTF-8') 96 options.add_argument('Accept= text / CSS,* / *') 97 options.add_argument('Accept - Language= zh - Hans - CN,zh - Hans;q = 0.5') 98 options.add_argument('Accept - EnCoding= gzip,deflate') 99 options.add_argument('user-agent=Mozilla/5.0 (windows NT 10.0; WOW64; TrIDent/7.0; rv:11.0) like Gecko')100 # 2. 定义浏览器驱动对象101 InternetExplorerDriver(options);102 103 104 .run(url,username,password,item_ID);105 }106 catch (Exception e)107 108 LogHelper.put(运行过程中出错,请重新打开再试"+e.StackTrace);109 110 111 112 113 114 运行115 116 <param name="url"></param>117 <param name="username"></param>118 <param name="password"></param>119 <param name="item_ID"></param>120 voID run(string url,1)">string username,1)">string password,1)"> item_ID)121 122 """运行起来"""123 # 3. 访问网站124 .driver.Navigate().GoToUrl(url);125 # 4. 最大化窗口126 .driver.Manage().Window.Maximize();127 this.checkIsExists(By.linkText(账户登录)))128 129 # 判断是否登录:未登录130 .login(username,password);131 132 this.checkIsExists(By.PartiallinkText(欢迎回来133 134 # 判断是否登录:已登录135 LogHelper.put(登录成功,下一步开始工作了136 .working(item_ID);137 138 139 140 LogHelper.put(登录失败,请设置账号密码141 142 143 144 145 停止运行146 147 stopRun()148 149 """停止"""150 151 152 153 # 如果驱动不为空,则关闭154 self.close_browser_nicely(self.__driver)155 this.driver != 156 157 .driver.Quit();158 # 关闭后切要为None,否则启动报错159 160 161 162 163 164 print('Stop Failure')165 166 finally167 168 169 170 171 172 173 voID login( password)174 175 # 5. 点击链接跳转到登录页面176 this.driver.FindElement(By.linkText()).Click();177 # 6. 输入账号密码178 # 判断是否加载完成179 this.checkIsExists(By.ID(180 181 182 183 184 185 186 187 188 189 工作状态190 191 192 voID working(193 194 while (.running)195 196 197 198 # 正常获取信息199 string200 201 )).Clear();202 )).SendKeys(item_ID);203 )).SendKeys(Keys.Enter);204 205 # 判断是否查询到商品206 string xpath = //div[@class=\"specialty-header search\"]/div[@class=\"specialty-description\"]/div[@class=\"gt-450\"]/span[2] 207 .checkIsExists(By.XPath(xpath)))208 209 int count = int.Parse(.driver.FindElement(By.XPath(xpath)).Text);210 if (count < 1211 {212 Thread.Sleep(213 LogHelper.put(没有查询到item ID =" + item_ID + 对应的信息214 continue215 }216 217 218 219 Thread.Sleep(220 LogHelper.put(没有查询到item ID2 =221 222 223 # 判断当前库存是否有货224 225 226 .checkIsExists(By.XPath(xpath1)))227 228 .driver.FindElement(By.XPath(xpath1)).Text;229 if (txt == .no_stock)230 231 # 当前无货232 Thread.Sleep(233 LogHelper.put(查询一次,无货234 235 236 237 # 链接path1238 string xpath2 = //div[@class=\"product-List\"]/div[@class=\"product\"]/div[@class=\"imgdiv\"]/a239 # 判断是否加载完毕240 # this.waiting((By.CLASS_name,"imgdiv"))241 .checkIsExists(By.XPath(xpath2)))242 243 .driver.FindElement(By.XPath(xpath2)).Click();244 Thread.Sleep(245 # 加入购物车246 this.checkIsExists(By.Classname(add-to-cart247 248 this.driver.FindElement(By.Classname(249 LogHelper.put(加入购物车成功,商品item-ID:" + item_ID);250 break251 252 253 254 LogHelper.put(未找到加入购物车按钮255 256 257 258 259 LogHelper.put(没有查询到,可能是商品编码不对,或者已下架260 261 Thread.Sleep(262 263 264 265 Thread.Sleep(266 LogHelper.put(e);267 268 269 270 271 272 判断是否存在273 274 <param name="by"></param>275 <returns></returns>276 bool checkIsExists(By by)277 278 279 280 int i = 0281 this.running && i < 3282 283 this.driver.FindElements(by).Count > 284 285 286 287 288 289 Thread.Sleep(290 i = i + 291 292 293 return 294 295 296 297 LogHelper.put(e);298 299 300 301 302 }303 }VIEw Code
关于日志帮助类,代码如下:
1 2 3 4 5 6 log4net; 7 8 [assembly: log4net.Config.XmlConfigurator(Watch = )] 9 10 11 12 日志帮助类13 14 static LogHelper15 16 17 日志实例18 19 static ILog logInstance = LogManager.GetLogger(smoking20 21 static Queue<string> queue = new Queue<string>(200022 23 voID put( msg)24 25 queue.Enqueue(msg);26 WriteLog(msg,LogLevel.Info);27 28 29 put(Exception ex)30 31 WriteLog(ex.StackTrace,LogLevel.Error);32 33 34 string get()35 36 if (queue.Count > 37 38 queue.Dequeue();39 40 41 42 43 44 45 46 voID WriteLog( message,LogLevel level)47 48 switch (level)49 50 case LogLevel.DeBUG:51 logInstance.DeBUG(message);52 53 LogLevel.Error:54 logInstance.Error(message);55 56 LogLevel.Fatal:57 logInstance.Fatal(message);58 59 LogLevel.Info:60 logInstance.Info(message);61 62 LogLevel.Warn:63 logInstance.Warn(message);64 65 default:66 67 68 69 70 71 72 73 74 75 enum LogLevel76 77 DeBUG = ,78 Error = 79 Fatal = 80 Info = 81 Warn = 482 83 }VIEw Code
关于log4net的实例定义,需要由配置文件【Log4NetConfig.xml】支撑,如下所示:
<?xml version="1.0" enCoding="utf-8" ?><log4net> 3 root 4 level value="DEBUG" /> 5 appender-ref ref="LogfileAppender" 6 ="ConsoleAppender" 7 </ 8 logger name="smoking" 9 ="ALL" 10 logger11 appender ="LogfileAppender" type="log4net.Appender.fileAppender" 12 param ="file" value="logs/${TMO}log-file.txt" 13 StaticLogfilename ="false"14 ="AppendTofile"="true" 15 layout type="log4net.Layout.PatternLayout"16 ="header"="[header]"17 ="Footer"="[Footer]"18 ="ConversionPattern"="%d [%t] %-5p %c [%x] - %m%n"layout20 filter ="log4net.Filter.LevelRangeFilter"21 ="LevelMin"22 ="LevelMax"="ERROR" filter24 appender25 ="ConsoleAppender"="log4net.Appender.ConsoleAppender" 26 27 ="%d [%t] %-5p %c [%x] - %m%n" 28 29 >VIEw Code
还需要在AssemblyInfo.cs中添加声明,如下所示:
1 [assembly: log4net.Config.DOMConfigurator(Configfile = Log4NetConfig.xml",ConfigfileExtension = xmltrue)]备注
行路难·其一
【作者】李白 【朝代】唐金樽清酒斗十千,玉盘珍羞直万钱。
停杯投箸不能食,拔剑四顾心茫然。
欲渡黄河冰塞川,将登太行雪满山。
闲来垂钓碧溪上,忽复乘舟梦日边。
行路难,行路难,多歧路,今安在?
长风破浪会有时,直挂云帆济沧海。
总结以上是内存溢出为你收集整理的C# 利用Selenium实现浏览器自动化 *** 作全部内容,希望文章能够帮你解决C# 利用Selenium实现浏览器自动化 *** 作所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)