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

Selenium C#:ADFS认证场景下页面重定向识别问题求助

Troubleshooting Selenium Unable to Locate Elements on ADFS Page Post-Redirection

I’ve run into similar headaches with ADFS pages blocking Selenium automation before. Since you’ve already ruled out basic waits and locator issues, let’s focus on workarounds for ADFS’s anti-automation measures:

1. Use Selenium Stealth to Mask Automation Traces

ADFS often flags Selenium by checking for browser properties that reveal automation (like the webdriver flag). The Selenium.Stealth library can help mask these traces to make your driver look like a real user’s browser.

Example Setup (C#):
First, install the NuGet package Selenium.Stealth, then update your initialization code:

[SetUp] 
public void Initialize() { 
    ChromeOptions options = new ChromeOptions();
    options.AddArgument("--start-maximized");
    options.AddArgument("--disable-blink-features=AutomationControlled");
    
    IWebDriver driver = new ChromeDriver(options);
    
    // Apply stealth settings to hide automation traces
    Stealth stealth = new Stealth(driver);
    stealth.AddHideWebDriver();
    stealth.AddHideChrome();
    stealth.AddRandomUserAgent();
    stealth.AddDisableWebDriverNotifications();
    stealth.Run();
    
    // Navigate to target page
    driver.Navigate().GoToUrl("https://test.test/"); 
}

2. Bypass ADFS with API-Based Authentication

If your application supports it, skip the ADFS UI entirely by authenticating via API to get valid session cookies, then inject those cookies into Selenium. This is the most reliable workaround for anti-automation login pages.

Example Workflow:

[SetUp] 
public void Initialize() { 
    IWebDriver driver = new ChromeDriver();
    
    // Step 1: Fetch auth cookies via API
    HttpClient client = new HttpClient();
    var loginPayload = new FormUrlEncodedContent(new[] {
        new KeyValuePair<string, string>("username", "test@test.com"),
        new KeyValuePair<string, string>("password", "password")
    });
    var response = await client.PostAsync("https://your-adfs-domain/login", loginPayload);
    var cookieHeaders = response.Headers.GetValues("Set-Cookie");
    
    // Step 2: Navigate to a domain-matching page first (required to set cookies)
    driver.Navigate().GoToUrl("https://test.test/");
    
    // Step 3: Inject cookies into the driver
    foreach (var cookieStr in cookieHeaders) {
        var cookieParts = cookieStr.Split(';')[0].Split('=');
        driver.Manage().Cookies.AddCookie(new Cookie(cookieParts[0], cookieParts[1]));
    }
    
    // Step 4: Refresh to load the authenticated session
    driver.Navigate().Refresh();
}

3. Wait for Full Page Readiness (Beyond Element Presence)

ADFS pages might load elements dynamically but block interaction until critical JavaScript finishes executing. Use explicit waits that check both element presence and document readiness:

// Replace your element find logic with this wait
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement usernameField = wait.Until(d => {
    // Verify document is fully loaded
    bool isPageReady = (bool)((IJavaScriptExecutor)d).ExecuteScript("return document.readyState === 'complete'");
    if (!isPageReady) return null;
    
    // Try to locate the element
    try {
        return d.FindElement(By.Name("element2"));
    } catch (NoSuchElementException) {
        return null;
    }
});
usernameField.SendKeys("test@test.com");

4. Check for Window/Tab Switching

Sometimes ADFS redirects open in a new tab instead of the same window. Verify and switch to the correct context:

// After clicking the MS login button
WebDriverWait tabWait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
tabWait.Until(d => d.WindowHandles.Count > 1);

var windowHandles = driver.WindowHandles;
driver.SwitchTo().Window(windowHandles.Last()); // Switch to the new tab

5. Configure Headless Mode Properly (If Used)

If running in headless mode, ADFS might detect it. Use these options to mimic a real browser:

ChromeOptions options = new ChromeOptions();
options.AddArgument("--headless=new");
options.AddArgument("--window-size=1920,1080");
options.AddArgument("--disable-gpu");
options.AddArgument("--no-sandbox");
options.AddArgument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36");

Start with the Selenium Stealth approach since it’s the easiest to implement, then move to API-based authentication if needed. These workarounds should help you bypass ADFS’s anti-automation checks.

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:30:08