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