基于双因素认证的Selenium+C#自动化测试问题咨询
应对双因素认证的Selenium自动化测试方案(C#/VS环境)
针对你遇到的平台新增双因素认证后无法继续Selenium自动化测试的问题,这里分享几个实用的解决思路:
1. 申请测试专用账号绕过2FA
这是最省心的方案,直接和开发、运维团队沟通:
- 要求创建一批无需双因素认证的测试专用账号,或者在后台配置测试IP/特定账号的白名单,跳过2FA校验。
- 这样你的原有登录代码完全不用改,直接用测试账号执行即可:
// 原有登录代码,直接使用测试账号 driver.FindElement(By.Id("email")).SendKeys("test-auto@yourplatform.com"); driver.FindElement(By.Id("password")).SendKeys("Test@1234"); driver.FindElement(By.CssSelector("button[type='submit']")).Click();
2. 自动生成TOTP验证码(适用于Google Authenticator类2FA)
如果平台用的是基于时间的一次性密码(TOTP),可以用C#库直接生成验证码:
- 先通过NuGet安装
OTP.NET包:Install-Package OTP.NET - 从测试账号的2FA设置中导出密钥(注意不要硬编码,存在配置文件或环境变量里)
- 代码中生成并填入验证码:
using OtpNet; using Base32; // 从配置读取2FA密钥 var base32Secret = Base32Encoding.ToBytes(ConfigurationManager.AppSettings["TestAccount2FASecret"]); var totpGenerator = new Totp(base32Secret); string currentOtp = totpGenerator.ComputeTotp(); // 先完成邮箱密码登录 driver.FindElement(By.Id("email")).SendKeys("user@yourplatform.com"); driver.FindElement(By.Id("password")).SendKeys("YourPassword"); driver.FindElement(By.Id("login-btn")).Click(); // 等待2FA输入框加载,填入验证码 var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); var otpInput = wait.Until(d => d.FindElement(By.Id("otp-code"))); otpInput.SendKeys(currentOtp); driver.FindElement(By.Id("verify-otp")).Click();
3. 自动读取邮箱/短信验证码
如果2FA是通过邮箱或短信发送验证码,可以自动读取并提取:
邮箱示例(以Exchange邮箱为例)
- 安装NuGet包:
Install-Package Microsoft.Exchange.WebServices.Managed.Api - 代码连接邮箱,搜索最新的2FA邮件并提取验证码:
using Microsoft.Exchange.WebServices.Data; using System.Text.RegularExpressions; // 初始化Exchange服务 var exchangeService = new ExchangeService(ExchangeVersion.Exchange2013_SP1); exchangeService.Credentials = new WebCredentials("test-mail@yourdomain.com", "MailPassword"); exchangeService.AutodiscoverUrl("test-mail@yourdomain.com", url => url.StartsWith("https://")); // 获取收件箱最新的1封邮件 var itemView = new ItemView(1) { OrderBy = { { ItemSchema.DateTimeReceived, SortDirection.Descending } } }; var latestEmails = exchangeService.FindItems(WellKnownFolderName.Inbox, itemView); if (latestEmails.Count > 0) { var otpEmail = EmailMessage.Bind(exchangeService, latestEmails[0].Id); // 用正则匹配6位验证码(根据实际邮件内容调整正则) var codeMatch = Regex.Match(otpEmail.Body.Text, @"\b\d{6}\b"); if (codeMatch.Success) { // 填入页面的2FA输入框 var otpInput = driver.FindElement(By.Id("otp-input")); otpInput.SendKeys(codeMatch.Value); driver.FindElement(By.Id("submit-otp")).Click(); } }
短信方案
可以使用支持API的短信接收服务(注意合规性),调用其API获取最新短信并提取验证码,逻辑和邮箱类似。
4. 复用浏览器已登录会话
提前手动完成一次登录(包括2FA),保存浏览器的配置文件,Selenium启动时加载该配置,直接复用登录状态:
Chrome示例
var chromeOptions = new ChromeOptions(); // 指定你的Chrome用户数据目录和配置文件(路径根据实际情况修改) chromeOptions.AddArgument(@"user-data-dir=C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data"); chromeOptions.AddArgument(@"profile-directory=Profile 2"); // 加载配置文件启动Chrome,直接进入已登录状态 var driver = new ChromeDriver(chromeOptions); driver.Navigate().GoToUrl("https://your-portal-url.com");
注意:启动Selenium前要关闭所有手动打开的Chrome窗口,避免进程冲突。
内容的提问来源于stack exchange,提问作者Atorixx
相关产品推荐
相关产品推荐

