c# - 无法使用 Selenium WebDriver 自动登录到 Azure Active Directory
问题描述
我正在尝试使用 Azure AD 测试登录到我们的 Web 应用程序,但登录按钮上的单击操作似乎没有注册。这是代码:
namespace WebApp.Tests
{
using System;
using System.IO;
using System.Threading;
using FluentAssertions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Support.UI;
[TestClass]
public class LoginTests
{
[TestMethod]
public void CanLogin()
{
string internetExplorerDriverServerDirectory = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
IWebDriver driver = new InternetExplorerDriver(internetExplorerDriverServerDirectory)
{
Url = "https://localhost:44399"
};
try
{
driver.Manage().Cookies.DeleteAllCookies();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(d => d.FindElement(By.Id("logonIdentifier")));
driver.FindElement(By.Id("logonIdentifier")).SendKeys("username");
driver.FindElement(By.Id("password")).SendKeys("password");
driver.FindElement(By.Id("next")).Click();
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
wait.Until(d => d.FindElement(By.ClassName("logo_title")));
driver.FindElement(By.ClassName("logo_title")).Text.Should().Contain("HELLO!");
}
finally
{
driver.Close();
driver.Quit();
driver.Dispose();
driver = null;
}
}
}
}
这是HTML的相关位:
<div class="entry">
<div class="entry-item">
<label for="logonIdentifier">Email Address</label>
<div class="error itemLevel" aria-hidden="true" style="display: none;">
<p role="alert"></p>
</div>
<input type="email" id="logonIdentifier" name="Username or email address" pattern="^[a-zA-Z0-9.!#$%&’'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$" placeholder="Email Address" value="" tabindex="1" autocomplete="off">
</div>
<div class="entry-item">
<div class="password-label">
<label for="password">Password</label>
<a id="forgotPassword" tabindex="2" href="/redacted">Forgot your password?</a>
</div>
<div class="error itemLevel" aria-hidden="true" style="display: none;">
<p role="alert"></p>
</div>
<input type="password" id="password" name="Password" placeholder="Password" tabindex="1" autocomplete="off">
</div>
<div class="working"></div>
<div class="buttons">
<button id="next" tabindex="1">Sign in</button>
</div>
</div>
在浏览器中看起来一切正常:用户名和密码字段已填写,按钮看起来像是被点击(小“工作”图标在其上方短暂出现)但没有任何反应。
- 在单击登录按钮后,我尝试了更长的等待时间(最多 30 秒)以显示主页。
wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
- 我尝试
Enter
在表单中发送密钥而不是单击按钮。
driver.FindElement(By.Id("password")).SendKeys(Keys.Enter);
- 我尝试执行一些 JavaScript 来调用按钮单击操作。
IJavaScriptExecutor jse = (IJavaScriptExecutor)driver;
jse.ExecuteScript("document.getElementById('next').click();");
- 我试过使用 Chrome 和 Firefox 驱动程序。
- 我已经尝试过本地开发版本和托管测试环境。
到目前为止没有任何工作。在此过程中,浏览器中没有显示错误/验证消息。
我对这个有点不知所措。
谢谢,斯图尔特。
解决方案
截至2019-01-20
,这对我有用:
[ClassInitialize]
public static void InitializeClass(TestContext testContext)
{
var options = new ChromeOptions();
options.AddArguments("--incognito");
driver = new ChromeDriver(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), options);
driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
}
[TestMethod]
public void Login()
{
driver.Navigate().GoToUrl("https://localhost:44399/");
driver.FindElement(By.Id("i0116")).Clear();
driver.FindElement(By.Id("i0116")).SendKeys("test@test.onmicrosoft.com");
driver.FindElement(By.Id("i0116")).SendKeys(Keys.Enter);
driver.FindElement(By.Id("i0118")).Clear();
driver.FindElement(By.Id("i0118")).SendKeys("password");
Thread.Sleep(500);
driver.FindElement(By.Id("i0118")).SendKeys(Keys.Enter);
driver.FindElement(By.Id("idSIButton9")).Click();
}
推荐阅读
- google-calendar-api - 自动为所有用户订阅超级管理员 Google 帐户
- node.js - 当我访问另一个组件时如何阻止某些组件加载
- c++ - 从 QML 编辑 QVariantMap
- java - 警告:使用 OpenJDK 11 时发生非法反射访问操作
- amazon-web-services - 消息发送期间的 AWS Websockets 错误
- r - 调用具有可变数量参数的函数
- javascript - 最近的 Blogspot 更新中断了 web 扩展的 window.getSelection()。有什么建议的解决方法吗?
- authentication - 托管在专用网络中并使用 Azure AD 作为 oauth 提供程序时,Keycloak 引发 UnknownHostException
- python - 熊猫的相关代码在哪里?
- firebase - 如何为来自另一个firebase项目的用户设置/传播firebase身份验证上下文(UID)以进行firestore规则配置?