C#Selenium - IE 11 - 单击链接打开新窗口而不是新选项卡

时间:2017-11-08 16:20:28

标签: c# selenium selenium-webdriver internet-explorer-11

我正在C#中运行Selenium测试以打开URL,使用提供的用户名&登录密码,然后导航到包含可下载报告的页面。请参阅下面的代码(注意:网站名称和用户名/密码被隐瞒):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium;
using OpenQA.Selenium.IE;
using OpenQA.Selenium.Support;
using OpenQA.Selenium.Support.UI;

namespace SeleniumProject
{
    class SeleniumTest
    {
        public static void Main(string[] args)
        {
            #region Constants

            //User Account Information
            const string username = "MyUsername";
            const string password = "MyPassword";

            //Initial Login Page URL and Elements
            const string urlLogin = "MyURL";
            const string usernameLoginName = "username";
            const string passwordLoginName = "password";
            const string submitLoginClassName = "btnAlign";

            //Welcome Page Element
            const string profileWelcomeClassName = "mstrLargeIconViewItemLink";

            #endregion

            int elementListIndex = 0;

            IWebDriver driver = new InternetExplorerDriver();
            driver.Manage().Window.Maximize();

            driver.Navigate().GoToUrl(urlLogin);

            driver.FindElement(By.Name(usernameLoginName)).SendKeys(username);
            driver.FindElement(By.Name(passwordLoginName)).SendKeys(password);
            driver.FindElement(By.ClassName(submitLoginClassName)).Click();

            if (driver.Title == "Servicer Performance Profile Home. MicroStrategy")
            {
                try
                {
                    driver.FindElement(By.ClassName(profileWelcomeClassName)).Click();
                }
                catch (NoSuchElementException ex)
                {
                    //failed
                }
            }

            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
            wait.Until(ExpectedConditions.VisibilityOfAllElementsLocatedBy(By.XPath("//img[contains(@src,'images/freddiemac/sppdash/navigation-drawer-1.png')]")));

            IReadOnlyList<IWebElement> elementList = driver.FindElements(By.XPath("//img[contains(@src,'images/freddiemac/sppdash/navigation-drawer-1.png')]"));

            string mainHandle = driver.CurrentWindowHandle;

            foreach (var element in elementList)
            {
                if (element.Displayed && elementListIndex == 5)
                {
                    element.Click();

                    driver.FindElement(By.XPath("//div[contains(.,'EDR Overview')]")).Click();
                    break;
                }
                else
                {
                    elementListIndex++;
                }
            }
        }
    }
}

每当我执行嵌套在foreach循环内的if语句中的最后一个Click()事件时,发生的事情,而不是在同一个IE中打开新选项卡的链接的正常行为,它将作为一个新窗口打开并恢复到之前的页面。通常,每当我手动登录本网站并单击此链接时,会打开一个新选项卡,其中包含另一个下载链接; 那是我想要访问的页面。

我不知道为什么这个新的浏览器窗口会打开前一页而不是我正在请求的目标页面。这可能与Selenium&amp; IE11没有相处?另一个想法是当前的登录会话以某种方式到期,但这都是在不到10秒的时间内执行的,所以我不认为这是问题所在。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

此问题已得到解决。经过多次尝试更改IE设置以处理新选项卡,以编程方式执行JavaScript onclick()事件(而不是使用本机浏览器单击命令),在空选项卡之间打开和切换,尝试右键单击键盘命令等,很多次尝试失败。问题归结为IE根本不兼容我试图做的事情。首次尝试使用Google Chrome证明是成功的。网站表现正常,应该触发新标签的链接确实触发了新标签。

对于那些刚接触Selenium webdriver测试的人,无论您的语言是C#还是其他语言,我的建议是不惜一切代价避免使用Internet Explorer。即使使用IE 11,我也不想做任何事情。使用Chrome作为首选测试。也许它会为您节省三个工作日的故障排除和调试。