Selenium C# - 如何告诉Selenium,我们已被重定向到另一个页面? (ADFS认证)

时间:2018-01-16 09:02:01

标签: c# selenium redirect

我最近开始使用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页面本身受到自动化保护,必须找到另一种解决方案。

2 个答案:

答案 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);
    }