如何解决C# Selenium处理错误认证凭证时的NoAlertPresentException问题
问题:Selenium C# 处理HTTP基础认证弹窗失败
自学Selenium C#自动化测试时,尝试访问基础认证页面,输入错误凭证后检查页面上的“Not Authorised”文本。但遇到问题:发送凭证时,认证弹窗出现却找不到用户名和密码输入框,最终报错:OpenQA.Selenium.NoAlertPresentException : no such alert。求C#中的简单解决方法。
我的代码:
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.Support.UI; namespace Selenium2.Authorisation { public class Authorisation { IWebDriver driver; [SetUp] public void Setup() { driver = new ChromeDriver(); driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5); driver.Manage().Window.Maximize(); } [Test] public void SendWrongUsernameToAuthenticationPopupTest() { string username = "abc"; string password = "admin"; string URL = "https://" + username + ":" + password + "@" + "the-internet.herokuapp.com/basic_auth"; driver.Navigate().GoToUrl(URL); // 尝试这段代码时出现错误: OpenQA.Selenium.NoAlertPresentException : no such alert IAlert alert = driver.SwitchTo().Alert(); alert.SendKeys(username); alert.Accept(); driver.Manage().Timeouts().Equals(TimeSpan.FromSeconds(5)); string text = driver.FindElement(By.TagName("p")).Text; string expectedText = "Not authorized"; IWebElement p2 = driver.FindElement(By.TagName("body")); Assert.AreEqual(expectedText, p2.Text, "未授权文本不一致"); } } }
解决方法
核心问题说明
你遇到的是HTTP基础认证弹窗,它是浏览器内置的系统级弹窗,不是JavaScript生成的alert,所以不能用driver.SwitchTo().Alert()来处理,这就是抛出NoAlertPresentException的原因。
方法1:URL嵌入凭证(简单直接)
你已经尝试了URL嵌入凭证的方式,但后面多余的alert处理代码是错误的,直接删除即可。另外注意driver.Manage().Timeouts().Equals()是无效的等待代码,建议改用显式等待。
修正后的代码:
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Support.UI; namespace Selenium2.Authorisation { public class Authorisation { IWebDriver driver; WebDriverWait wait; [SetUp] public void Setup() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); driver.Manage().Window.Maximize(); } [Test] public void SendWrongUsernameToAuthenticationPopupTest() { string username = "abc"; string password = "admin"; // 直接在URL中嵌入凭证 string URL = $"https://{username}:{password}@the-internet.herokuapp.com/basic_auth"; driver.Navigate().GoToUrl(URL); // 显式等待页面元素加载完成 var bodyElement = wait.Until(d => d.FindElement(By.TagName("body"))); string expectedText = "Not authorized"; Assert.AreEqual(expectedText, bodyElement.Text.Trim(), "未授权文本不一致"); } [TearDown] public void TearDown() { driver.Quit(); } } }
方法2:使用DevTools协议(适配现代浏览器)
部分现代浏览器(如Chrome)可能限制URL嵌入凭证的方式,这时可以用Selenium的DevTools API设置HTTP认证头:
using NUnit.Framework; using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using OpenQA.Selenium.DevTools; using OpenQA.Selenium.DevTools.V120.Network; using OpenQA.Selenium.Support.UI; using System.Text; namespace Selenium2.Authorisation { public class Authorisation { IWebDriver driver; WebDriverWait wait; IDevTools devTools; [SetUp] public void Setup() { driver = new ChromeDriver(); wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); devTools = driver as IDevTools; driver.Manage().Window.Maximize(); } [Test] public void SendWrongUsernameToAuthenticationPopupTest() { string username = "abc"; string password = "admin"; string baseUrl = "https://the-internet.herokuapp.com/basic_auth"; // 初始化DevTools会话 var session = devTools.GetDevToolsSession(); var networkHelper = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V120.DevToolsDomains>().Network; // 启用网络监控 networkHelper.Enable(new EnableCommandSettings()); // 生成Base64编码的认证凭证 string credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")); // 设置HTTP请求头 networkHelper.SetExtraHTTPHeaders(new SetExtraHTTPHeadersCommandSettings { Headers = new Dictionary<string, string> { { "Authorization", $"Basic {credentials}" } } }); // 访问目标页面 driver.Navigate().GoToUrl(baseUrl); // 验证结果 var bodyElement = wait.Until(d => d.FindElement(By.TagName("body"))); string expectedText = "Not authorized"; Assert.AreEqual(expectedText, bodyElement.Text.Trim(), "未授权文本不一致"); } [TearDown] public void TearDown() { driver.Quit(); } } }
内容的提问来源于stack exchange,提问作者Mikolaj
相关产品推荐
相关产品推荐

