IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Selenium驱动Chrome自动化 -> 正文阅读

[开发测试]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
{
    /// <summary>
    /// 
    /// </summary>
    public class ChromeDriver
    {
        /// <summary>
        /// 获取Chrome驱动对象
        /// </summary>
        /// <param name="WebDriverPath">IEDriverServer.exe 的存放路径</param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// 关闭驱动
        /// </summary>
        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
{
    /// <summary>
    /// 应用demo
    /// 驱动下载地址 https://npm.taobao.org/mirrors/chromedriver/
    /// 测试实验 92 版本
    /// </summary>
    public class ChromeDriverDemo
    {
        ChromeDriver iEDriver = new ChromeDriver();

        /// <summary>
        /// 测试Demo
        /// </summary>
        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\"]"));

                // 进入到iframe
                driver.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();
        }

        /// <summary>
        /// 点击监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void Driver_ElementClicked(object sender, WebElementEventArgs e)
        {
            Console.WriteLine("Driver_ElementClicked");
        }

        /// <summary>
        /// 导航监听
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void Driver_NavigatedForward(object sender, WebDriverNavigationEventArgs e)
        {
            Console.WriteLine("Driver_NavigatedForward");
        }

        /// <summary>
        /// 等待
        /// </summary>
        /// <param name="driver">驱动</param>
        /// <param name="by">选择器</param>
        /// <param name="timeWait">等待事件 毫秒</param>
        /// <returns></returns>
        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));
        }

        /// <summary>
        /// 拖动元素 针对元素
        /// </summary>
        /// <param name="driver">驱动</param>
        /// <param name="element">要拖动的元素</param>
        /// <param name="offsetX">X轴方向的距离</param>
        /// <param name="offsetY">Y轴方向的距离</param>
        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();
        }

        /// <summary>
        /// 根据缩放计算相对于屏幕的实际尺寸
        /// </summary>
        /// <param name="value">原始值</param>
        /// <returns></returns>
        public int GetScreenOfZoom(decimal value)
        {
            return Convert.ToInt32(Math.Round((decimal)ScreenUtils.ScaleDpiX * value, 0, MidpointRounding.AwayFromZero));
        }
    }
}

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 12:13:08  更:2021-09-03 12:15:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 5:56:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码