dotnet使用Selenium执行自动化任务

如果要做百度文库,百度贴吧,百度知道签到,你,会怎么做?前不久我还会觉得这好像太麻烦了,now,soeasy。

自动化测试工具:Selenium

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括 ,Chrome,Firefox,IE,PhantomJS(一个基于webkit内核的无界面浏览器)等。

  • Selenium项目地址:https://github.com/SeleniumHQ/selenium

  • Selenium文档地址:http://seleniumhq.github.io/selenium/docs/api/dotnet/

在.net framework下Selenium的使用

  1. 新建解决方案,控制台项目

  2. 添加NuGet包:Selenium.WebDriver 3.5.1 Selenium.Support 3.5.1

  3. 通过NuGet下载Phantomjs或者手动下载驱动,设置环境变量

    • Selenium.PhantomJS.WebDriver //无头浏览器 无界面

    • Selenium.Chrome.WebDriver //需要下载浏览器 ,运行时会打开浏览器

    • Selenium.Firefox.WebDriver //需要下载浏览器

简单使用示例

使用PhantomJS驱动保存百度首页截图

    var driver = new PhantomJSDriver();//创建浏览器driver.Navigate().GoToUrl("http://www.baidu.com");//打开百度//截图保存Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();screenshot.SaveAsFile("baidu.jpg", ScreenshotImageFormat.Jpeg);    //退出driver.Quit();

点击百度搜索然后截图

    var driver = new PhantomJSDriver();//创建浏览器driver.Navigate().GoToUrl("http://www.baidu.com");//打开百度driver.FindElement(By.Id("kw")).SendKeys("Selenium");driver.FindElement(By.Id("su")).Click();Thread.Sleep(3000);//搜索结果显示出来再接图//截图保存Screenshot screenshot = ((ITakesScreenshot)driver).GetScreenshot();screenshot.SaveAsFile("baidu.jpg", ScreenshotImageFormat.Jpeg);    //退出driver.Quit();

登录博客园发个闪存

源码地址:https://coding.net/u/yimocoding/p/WeDemo/git/tree/SeleniumDemo/SeleniumDemo

百度文库,百度贴吧,百度知道签到

要是用模拟请求的方式得累死个人。

  static void 百度签到(){   
     dynamic loginUser = new{UserName = "yimo",UserPwd = "123456"};      
     
     var myDriver = new PhantomJSDriver();//创建浏览器var defTask = new List<string>() { "文库", "贴吧", "知道" };    
     const string _loginUrl = "https://passport.baidu.com/v2/?login";      //跳转页面myDriver.Navigate().GoToUrl(_loginUrl);myDriver.FindElement(By.Id("TANGRAM__PSP_3__userName")).SendKeys(loginUser.UserName);myDriver.FindElement(By.Id("TANGRAM__PSP_3__password")).SendKeys(loginUser.UserPwd);myDriver.FindElement(By.Id("TANGRAM__PSP_3__submit")).Click();Console.WriteLine(myDriver.Title);  
     if (defTask.Contains("文库")){          const string _wkSignUrl = "https://wenku.baidu.com/task/browse/daily";Console.WriteLine($"开始百度文库签到");myDriver.Navigate().GoToUrl(_wkSignUrl);myDriver.ExecScript("$('.bg').remove();$('.g-btn-pass').click();");Console.WriteLine("百度文库签到完成");Thread.Sleep(1000);myDriver.SaveImg("文库签到.png");}    
     if (defTask.Contains("贴吧")){          const string _tiebaUrl = "https://tieba.baidu.com/index.html";Console.WriteLine("开始百度贴吧签到");myDriver.Navigate().GoToUrl(_tiebaUrl);myDriver.FindElement(By.ClassName("onekey_btn")).Click();myDriver.FindElement(By.ClassName("sign_btn_nonmember")).Click();Console.WriteLine("百度贴吧签到完成");Thread.Sleep(1000);myDriver.SaveImg("贴吧签到.png");}  
     if (defTask.Contains("知道")){          const string _tiebaUrl = "https://zhidao.baidu.com/";Console.WriteLine("开始百度知道签到");myDriver.Navigate().GoToUrl(_tiebaUrl);myDriver.FindElement(By.ClassName("go-sign-in")).Click();myDriver.FindElement(By.ClassName("sign-in-btn")).Click();Console.WriteLine("百度知道签到完成");Thread.Sleep(1000);myDriver.SaveImg("知道签到.png");}      //退出myDriver.Quit();}

淘宝领取淘金币

  static void 淘金币领取(){      
    dynamic loginUser = new{UserName = "yimo",UserPwd = "123456"};    
     var myDriver = new PhantomJSDriver();//创建浏览器const string _loginUrl = "https://login.taobao.com/member/login.jhtml";  
      const string _taoUrl = "https://taojinbi.taobao.com/index.htm";      //跳转页面myDriver.Navigate().GoToUrl(_loginUrl);      //账号登录myDriver.FindElement(By.Id("J_Quick2Static")).Click();myDriver.FindElement(By.Id("TPL_username_1")).SendKeys(loginUser.UserName);      myDriver.FindElement(By.Id("TPL_password_1")).SendKeys(loginUser.UserPwd);myDriver.FindElement(By.Id("J_SubmitStatic")).Click();myDriver.Navigate().GoToUrl(_taoUrl);myDriver.FindElement(By.ClassName("J_GoTodayBtn")).Click();      //滑动验证码Actions action = new Actions(driver);
      var source = driver.FindElement(By.ClassName("btn_slide"));    
     if (source == null){      
        return;}action.ClickAndHold(source).MoveByOffset(300,0);action.MoveToElement(source).Release();IAction actions = action.Build();actions.Perform();}

Ctrl+F5,截图保存成功

常用接口

var driver=new PhantomJSDriver();//驱动实例

  1. INavigation接口: 浏览器导航接口(前进,后退,刷新),接口实例:driver.Navigate()

  2. IOptions接口: 浏览器信息接口(Cookie,设置窗口等操作),接口实例:driver.Manage()

  3. IWebElement 通过driver.FindElement()筛选获取到元素信息(Text等),可以对元素赋值(SendKeys())单击(Click())等操作

常用操作

  • 窗口最大化:driver.Manage().Window.Maximize();

  • Cookie操作接口获取:driver.Manage().Cookies

  • 执行js:((IJavaScriptExecutor)driver).ExecuteScript("document.body.innerHTML='Selenium'");

  • 截图:((ITakesScreenshot)driver).GetScreenshot().SaveAsFile("保存路径.png", ScreenshotImageFormat.Png);

  • 拖动,文章介绍参考

      var driver = new PhantomJSDriver();By by=By.ClassName("btn_slide");  int x=300,y=0Actions action = new Actions(driver);  var source = driver.FindElement(by);  if (source == null){  return;}action.ClickAndHold(source).MoveByOffset(x, y);action.MoveToElement(source).Release();IAction actions = action.Build();actions.Perform();

立个flag

下一篇:SeleniumNetCoreDemo+travis-ci+Github
Demo下载:https://coding.net/u/yimocoding/p/WeDemo/git/tree/SeleniumDemo
clone命令:git clone https://git.coding.net/yimocoding/WeDemo.git -b SeleniumDemo

原文地址:http://www.cnblogs.com/morang/p/7441091.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

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

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

相关文章

若依前后端部署之后验证码不显示

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 最近的几天都在搞publiccms的内容&#xff0c;从0到1实现&#xff0c;在花费了大量精力下&#xff0c;终于将一个门户站完完全全的实现了&#xff0c;且还可以…

汇编语言(六)之输出字符的前导后字符

输入一个字符&#xff0c;输出该字符的前导后字符 程序运行&#xff1a; 代码&#xff1a; datas segmenta db ?inputPrompt db input a lowercase character:$outputPrompt db 0dh,0ah,output …

若依部署上线之后验证码不显示的解决方法之一

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;????雄雄的小课堂????。”最近的几天都在搞publiccms的内容&#xff0c;从0到1实现&#xff0c;在花费了大量精力下&#xff0c;终于将一个门户站完完全全的实现了&#xff0c;且还可以自定义扩…

在 ASP.NET Core 中执行租户服务

本博文翻译自&#xff1a;http://gunnarpeipman.com/2017/08/tenant-providers/ 在我之前关于 Entity Framework core 2.0 全局查询过滤器的文章中&#xff0c;我提出了一个想法&#xff0c;当构建模型时&#xff0c;如何自动地将查询过滤器应用到所有的领域实体中&#xff0c…

【最全最详细】使用publiccms实现动态可维护的首页轮播

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 &#x1f481;‍♂️前言 前几天&#xff0c;分享了一篇关于publiccms的教程&#xff0c;在这里&#xff1a;【最全最详细】publiccms使用教程&#xff0c;不…

汇编语言(七)之字符串转大写

输入一串字符&#xff0c;将字符串的小写字母转成大写字母 程序运行&#xff1a; 代码&#xff1a; datas segmentoriginalCaseMaxLength db 0ffh,0originalCase db 100h dup(?)uppercase db 100h dup(?)inputPrompt …

基于.NET CORE微服务框架 -谈谈surging API网关

1、前言 对于最近surging更新的API 网关大家也有所关注&#xff0c;也收到了不少反馈提出是否能介绍下Api网关&#xff0c;那么我们将在此篇文章中谈谈surging Api 网关 开源地址&#xff1a;https://github.com/dotnetcore/surging 2. API网关 简介 API 网关是服务提供者…

【最全最详细】使用publiccms实现动态可维护的导航菜单栏

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;????**雄雄的小课堂????。”????‍????前言昨天&#xff0c;给大家整理的是通过publiccms实现动态可维护的轮播图&#xff0c;有需要的小伙伴可以点击这里&#xff1a;publiccms实现动…

【上海】关于云计算,你想学习哪些知识,快让我来满足你

超高人气、干货十足的 免费云计算课堂 Microsoft Cloud Day云思塾 2017下半年再出发&#xff01; 即将开启上海之旅&#xff0c;微软诚邀您参加&#xff01; Microsoft Cloud Day是个啥&#xff1f; 这是为时一天的结合用户培训与经验分享的云计算免费研讨会&#xff0c;通…

【最全最详细】publiccms实现将公共部分提取成单独模块引入

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 &#x1f9d8;‍♂️往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&a…

汇编语言(九)之十六进制数值转二进制

输入四位十六进制的数值&#xff0c;将十六进制数值转二进制输出 程序运行&#xff1a; 代码&#xff1a; datas segmentmaxLength db 5hexLength db 0hex db 5 dup(?)bin db 100h dup(?)inputPr…

.NET Core 2.0 单元测试中初识 IOptionsMonitoramp;lt;Tamp;gt;

在针对下面设置 CookieAuthenticationOptions 的扩展方法写单元测试时遇到了问题。 public static IServiceCollection AddCnblogsAuthentication(this IServiceCollection services, IConfigurationSection redisConfiguration, Action<CookieAuthenticationOptions> …

汇编语言(十)之最小偶数

在数组中查找最小的偶数&#xff0c;并输出 程序运行&#xff1a; 代码&#xff1a; datas segmentminEven dw 0DATA dw 10 dup(101,1,21,81,5,261,3,421,4,541)DATACount dw ($-DATA)/type DATAoutputPrompt db min eve…

【最全最详细】publiccms常用的代码片段

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 &#x1f9d8;‍♂️往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&a…

Remoting核心类库RealProxy迁移

在学习.net core的过程中&#xff0c;我们已经明确被告知&#xff0c;Remoting将不会被支持。官方的解释是&#xff0c;.net framework 类型包含了太多的Runtime的内容&#xff0c;是一个非常重量级的服务实现&#xff0c;已被确定为一项有问题的体系结构。说白了就是迁移的难度…

【最全最详细】publiccms其他常用代码片段(内容、站点)

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 ✍往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&#xff08;使用方式…

汇编语言(十一)之统计非数字字符个数

输入以$结尾的字符串&#xff0c;统计并输出非数字字符的个数 程序运行&#xff1a; 代码&#xff1a; datas segmentstring db 100h dup(?)nonNumberCount dw 0inputPrompt db input string and end by $:inputPromptLen …

Orleans配置---持久化

Grain理想的生命周期应该如下图所示: 这就如美国电影中的大反派一样,死了再复活,死了再复活.当然如果复活的反派没有记忆,这个电影就真没劲.现在我要求Grain的复活是有记忆的复活.看我怎么办到. 其中持久化需要用到数据库,因为只有数据库才能比较方便的为以后event sourcing做…

汇编语言(十二)之统计小于平均数的个数

在一个数组中找出并统计并该数组的平均数小的数的个数 程序运行&#xff1a; 代码&#xff1a; datas segmentDATA dw 10h dup(1,2,3,4,-1,5,7,-99,29,-11,294,-21,45,6,57,-54)average dw 0countOfLowAverage dw 0outputAverage …

【最全最详细】publiccmsCSS和JS引入无效的解决方法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;&#x1f449;雄雄的小课堂&#x1f448;。 ✍往期系列 这两天一直在整理Publiccms系列的教程&#xff0c;有需要的小伙伴们可以点击以下链接查看&#xff1a; ☝publiccms使用教程&#xff08;使用方式…