Selenium驱动Chrome自动化
1.环境准备
1.1 开发工具
Visual Studio 2017
1.2 驱动下载地址
Chrome驱动下载地址:https://npm.taobao.org/mirrors/chromedriver/
找到对应电脑的版本下载,比如我本机是Windows 操作系统、Chrome 92版本的,那下载地址就是https://npm.taobao.org/mirrors/chromedriver/92.0.4515.43/chromedriver_win32.zip
2.库安装
需要使用库的项目,右键->管理Nuget程序包

3.创建驱动对象
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Diagnostics;
using System.Linq;/*
*┌────────────────────────────────────────────────┐
*│ 描 述:谷歌驱动类
*│ 作 者:1326702940@qq.com
*│ 版 本:1.0
*│ 创建时间:2021-8-25
*└────────────────────────────────────────────────┘
*/
namespace ChromeDriver
{/// /// /// public class ChromeDriver{/// /// 获取Chrome驱动对象/// /// IEDriverServer.exe 的存放路径/// public IWebDriver GetChromeDriver(string WebDriverPath = "", ChromeOptions options = null){if (string.IsNullOrWhiteSpace(WebDriverPath)){WebDriverPath = ".";}if (options == null){options = new ChromeOptions();// 隐藏Chrome 正在受到自动化软件控制,避免前端检测 76之前的写法options.AddArgument("disable-infobars");// 隐藏Chrome 正在受到自动化软件控制,避免前端检测 76之后的写法options.AddExcludedArgument("enable-automation");options.AddAdditionalCapability("useAutomationExtension", false);// 设置每次下载时,弹窗选择下载路径options.AddUserProfilePreference("download.prompt_for_download", true);}var service = ChromeDriverService.CreateDefaultService(WebDriverPath);service.HideCommandPromptWindow = true;var driver = new OpenQA.Selenium.Chrome.ChromeDriver(service, options);if (driver != null){driver.Manage().Window.Maximize();driver.Manage().Timeouts().PageLoad = TimeSpan.FromMilliseconds(60000);driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromMilliseconds(1500);driver.Manage().Timeouts().AsynchronousJavaScript = TimeSpan.FromMilliseconds(60000);}return driver;}/// /// 关闭驱动/// public void CloseChromeDriver(){Process[] pros = Process.GetProcessesByName("chromedriver");if (pros.Length > 10){var prosOrder = pros.OrderBy(item => { return item.StartTime; }).ToArray();for (int i = 10; i < prosOrder.Length; i++){prosOrder[i].Kill();}}}}
}
4.驱动页面元素
using Common;
using OpenQA.Selenium;
using OpenQA.Selenium.Interactions;
using OpenQA.Selenium.Support.Events;
using OpenQA.Selenium.Support.UI;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;/*
*┌────────────────────────────────────────────────┐
*│ 描 述:Chrome驱动示例Demo
*│ 作 者:1326702940@qq.com
*│ 版 本:1.0
*│ 创建时间:2021-8-27
*└────────────────────────────────────────────────┘
*/
namespace ChromeDriver
{/// /// 应用demo/// 驱动下载地址 https://npm.taobao.org/mirrors/chromedriver//// 测试实验 92 版本/// public class ChromeDriverDemo{ChromeDriver iEDriver = new ChromeDriver();/// /// 测试Demo/// public void LoginTest(){// 驱动对象IWebDriver idriver = iEDriver.GetChromeDriver();// 页面事件监听EventFiringWebDriver driver = new EventFiringWebDriver(idriver);// 执行js对象IJavaScriptExecutor jsExec = (IJavaScriptExecutor)driver;// 点击监听driver.ElementClicked += Driver_ElementClicked;// 导航监听driver.NavigatedForward += Driver_NavigatedForward;// 弹个窗jsExec?.ExecuteScript("alert('我是警告框');");// 点击 警告框的 确定 按钮driver.SwitchTo()?.Alert()?.Accept();// 导航到测试网址driver.Navigate().GoToUrl("https://yxyh.aicenyi.com/");#region 如果元素位于iframe里try{IWebElement iframe = WaitUntilElement(driver, By.XPath("//*[@id=\"loginIframe\"]"));// 进入到iframedriver.SwitchTo().Frame(iframe);// 一顿操作猛如虎// 释放iframe,重新回到主页面上driver.SwitchTo().DefaultContent();}catch (Exception ex){;}#endregion// 输入用户名WaitUntilElement(driver, By.Id("userName"))?.SendKeys("admin");Thread.Sleep(1000);// 输入密码WaitUntilElement(driver, By.Id("password"))?.SendKeys("123456");// 截图前这个操作并非必须,只是为了展示更多知识点// 移动鼠标到验证码元素上Actions action = new Actions(driver);var imageObjElement = WaitUntilElement(driver, By.Id("imgObj"));action?.MoveToElement(imageObjElement);// 获取验证码坐标var point = Point.Empty;point.X = (imageObjElement?.Location.X).Value;point.Y = (imageObjElement?.Location.Y).Value;// 获取验证码宽高var size = Size.Empty;size.Width = (imageObjElement?.Size.Width).Value;size.Height = (imageObjElement?.Size.Height).Value;// 根据屏幕缩放计算真实值 如果屏幕无缩放,不需要这样处理int offsetX = GetScreenOfZoom((decimal)point.X);int offsetY = GetScreenOfZoom((decimal)point.Y);int width = GetScreenOfZoom((decimal)size.Width);int height = GetScreenOfZoom((decimal)size.Height);// 验证码截图ITakesScreenshot screenshotDriver = driver as ITakesScreenshot;Screenshot screenshot = screenshotDriver.GetScreenshot();var picBytes = ImageHelper.GetPartOfImageRecFromBytes(screenshot.AsByteArray, width, height, offsetX, offsetY);// 保存为本地图片var picBytes2 = picBytes;MemoryStream ms = new MemoryStream(picBytes2);Image img = Image.FromStream(ms);img.Save("cc.png");img?.Dispose();// 输入验证码// 点击验证码输入框var yzmElement = WaitUntilElement(driver, By.Id("imageCode"));yzmElement?.Click();yzmElement.SendKeys("验证码11");// 点击登录var loginElement = WaitUntilElement(driver, By.Id("loginBtn"));loginElement?.Click();iEDriver.CloseChromeDriver();}/// /// 点击监听/// /// /// public void Driver_ElementClicked(object sender, WebElementEventArgs e){Console.WriteLine("Driver_ElementClicked");}/// /// 导航监听/// /// /// public void Driver_NavigatedForward(object sender, WebDriverNavigationEventArgs e){Console.WriteLine("Driver_NavigatedForward");}/// /// 等待/// /// 驱动/// 选择器/// 等待事件 毫秒/// public IWebElement WaitUntilElement(IWebDriver driver, By by, int timeWait = 1000){WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromMilliseconds(timeWait));return wait.Until(dri => dri.FindElement(by));}/// /// 拖动元素 针对元素/// /// 驱动/// 要拖动的元素/// X轴方向的距离/// Y轴方向的距离public void HoldAndMove(IWebDriver driver, IWebElement element, int offsetX, int offsetY){Actions action = new Actions(driver);action?.ClickAndHold(element).Perform();action?.MoveByOffset(offsetX, offsetY).Perform();if (!driver.ToString().Equals("OpenQA.Selenium.IE.InternetExplorerDriver")){// 非IE 取消 点击action?.Click()?.Perform();}// 释放action?.Release()?.Perform();}/// /// 根据缩放计算相对于屏幕的实际尺寸/// /// 原始值/// public int GetScreenOfZoom(decimal value){return Convert.ToInt32(Math.Round((decimal)ScreenUtils.ScaleDpiX * value, 0, MidpointRounding.AwayFromZero));}}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
