You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:50:27