我最近开始使用Selenium WebDriver。不久之后,我被以下问题阻止了。
我想测试一个首先要求用户使用Microsoft帐户登录的平台,然后用户被重定向到公司的ADFS页面。在用户输入他的凭证后,他最终登陆到所需的页面。
基本上,我成功使用MS凭据登录用户,然后重定向到ADFS页面。问题在于,当我被重定向时,Selenium没有意识到我在不同的页面上,所以无法进行进一步的测试......我看到了一个带框架的解决方案,但是在这种情况下不适用,因为这里没有框架......
直到现在的代码:
[SetUp]
public void Initialize()
{
//Go to desired page
driver.Navigate().GoToUrl("https://test.test/");
//User gets redirected to MS login platform
}
[Test]
public void ExecuteTest()
{
//Writing email and clicking on next in order to re-direct to ADSF
IWebElement element = driver.FindElement(By.Name("element1"));
element.SendKeys("test@test.com");
driver.FindElement(By.Id("button")).Click();
//Trying to write credentials in the ADSF page
driver.FindElement(By.Name("element2"));
element.SendKeys("test@test.com");
driver.FindElement(By.Name("element3"));
element.SendKeys("password");
driver.FindElement(By.Id("Button2")).Click();
}
结果StackTrace:
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
at OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id)
at OpenQA.Selenium.By.<>c__DisplayClass16_0.<Id>b__0(ISearchContext context)
at OpenQA.Selenium.By.FindElement(ISearchContext context)
at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
Result Message:
OpenQA.Selenium.NoSuchElementException : no such element: Unable to locate element: {"method":"id","selector":"passwordInput"}
更新:在尝试了下面提到的所有内容并查看有关ADSF授权的一些文章之后,我认为问题不是因为没有等待页面加载/错误的ID,名称等或类似的东西..我假设ADSF页面本身受到自动化保护,必须找到另一种解决方案。
答案 0 :(得分:0)
登录后,试试这个 -
driver.SwitchTo().Window(driver.WindowHandles.Last());
答案 1 :(得分:0)
我认为你没有找到&#34;元素未被发现&#34;或&#34;元素不可见&#34;错误。您可以检查您是否在正确的页面上,或者可以尝试等待页面完全加载,如下所示:
public void WaitForPageToBeFullyLoaded(int timeSpan)
{
new WebDriverWait(Driver, TimeSpan.FromSeconds(timeSpan)).Until(
d => ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState").Equals("complete"));
}
其他选项是等待元素可见或可点击:
public IWebElement WaitForCondition(IWebDriver driver, Func<IWebDriver, IWebElement> expectedCondition,
double timeout)
{
var webDriverWait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
return webDriverWait.Until(expectedCondition);
}