Selenium驱动IE自动化

1.环境准备

1.1开发工具

Visual Studio 2017

1.2 驱动下载地址

IE驱动下载地址:http://selenium-release.storage.googleapis.com/index.html

找到对应电脑的版本下载,比如我本机是Windows 操作系统、使用WebDriver是 v3.14.0,那下载地址就是http://selenium-release.storage.googleapis.com/3.14/IEDriverServer_Win32_3.14.0.zip

1.3 环境设置

>>实例代码使用IE11
>>IE浏览器设置 缩放比例100%
>>IE浏览器Internet选项 【安全】选项中 取消勾选 启用保护模式

详细设置可参考:https://blog.csdn.net/bo_mask/article/details/75041400

2.库安装

需要使用库的项目,右键->管理Nuget程序包

3.创建驱动对象

using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using System;
using System.Diagnostics;
using System.Linq;

/*
*┌────────────────────────────────────────────────┐
*│ 描   述:IE驱动类
*│ 作   者:[email protected]
*│ 版   本:1.0
*│ 创建时间:2021-8-24
*└────────────────────────────────────────────────┘
*/
namespace IEDriver
{
    /// <summary>
    /// 使用前设置
    /// 1.实例代码使用IE11
    /// 2.IE浏览器设置 缩放比例100%
    /// 3.IE浏览器Internet选项 【安全】选项中 取消勾选 启用保护模式
    /// https://blog.csdn.net/bo_mask/article/details/75041400
    ///驱动下载地址: http://selenium-release.storage.googleapis.com/index.html
    /// </summary>
    public class IEDriver
    {
        /// <summary>
        /// 获取IE驱动对象
        /// </summary>
        /// <param name="WebDriverPath">IEDriverServer.exe 的存放路径</param>
        /// <returns></returns>
        public IWebDriver GetIEDriver(string WebDriverPath = "", InternetExplorerOptions options = null)
        {
            if (string.IsNullOrWhiteSpace(WebDriverPath))
            {
                WebDriverPath = ".";
            } 

            if (options == null)
            {
                options = new InternetExplorerOptions()
                {
                    IgnoreZoomLevel = true,
                    IntroduceInstabilityByIgnoringProtectedModeSettings = true,
                    // 解决Win7 IE11登录问题"OpenQA.Selenium.IE.InternetExplorerDriverCurrently focused window has been closed"
                    // 需要定义初始化网页
                    InitialBrowserUrl = "www.baidu.com",
                    //解决Win7 IE11输入慢的问题
                    RequireWindowFocus = true
                };
            }

            var service = InternetExplorerDriverService.CreateDefaultService(WebDriverPath);
            service.HideCommandPromptWindow = true;

            var driver = new InternetExplorerDriver(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 CloseIEDriver()
        {
            Process[] pros = Process.GetProcessesByName("IEDriverServer");
            if (pros.Length > 5)
            {
                var prosOrder = pros.OrderBy(item => { return item.StartTime; }).ToArray();
                for (int i = 5; 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;

/*
*┌────────────────────────────────────────────────┐
*│ 描   述:IE驱动示例Demo
*│ 作   者:[email protected]
*│ 版   本:1.0
*│ 创建时间:2021-8-25
*└────────────────────────────────────────────────┘
*/
namespace IEDriver
{
    /// <summary>
    /// 应用demo
    /// </summary>
    public class IEDriverDemo
    {
        IEDriver iEDriver = new IEDriver();

        /// <summary>
        /// 测试Demo
        /// </summary>
        public void LoginTest()
        {
            // 驱动对象
            IWebDriver idriver = iEDriver.GetIEDriver();
            // 页面事件监听
            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();

            // 复制到粘贴板
            // 解决IE输入慢问题,避免中文输入法影响所以采用复制的方式
            System.Windows.Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                System.Windows.Clipboard.Clear();
                System.Windows.Clipboard.SetDataObject("验证码111");
            })).Wait();

            // 粘贴Ctrl+V 释放
            action = new Actions(driver);
            action.KeyDown(Keys.Control).SendKeys("v").SendKeys(Keys.Null).Perform();

            // 点击登录
            var loginElement = WaitUntilElement(driver, By.Id("loginBtn"));
            loginElement?.Click();

            // 最终执行个有返回值的js
            var browerVersion = jsExec.ExecuteScript("return window.navigator.userAgent.toLowerCase();");
            Console.WriteLine("当前浏览器版本为:" + browerVersion);

            iEDriver.CloseIEDriver();
        }

        /// <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));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq1326702940/article/details/120068537
今日推荐