天道酬勤,学无止境

Opera - driver.WindowHandles returns wrong count

In my scenario, I'm verifying whether clicking on a link navigates to another page (verifying for the page title). IE, FF and chrome return 2 as expected but Opera returns 4. I didn't have any other Opera instances opened at the time of running tests. It clicks on the link and required page is opened but WindowHandles returns 4.

Code:

string BaseWindow = Drivers._driverInstance.CurrentWindowHandle;
Drivers._driverInstance.SwitchTo().Frame(Drivers._driverInstance.FindElement(By.ClassName("iframe-fix")));
if (Drivers._driverInstance.GetType().Name.ToString() == "InternetExplorerDriver")
{
    IJavaScriptExecutor js = (IJavaScriptExecutor)Drivers._driverInstance;
    js.ExecuteScript("arguments[0].click();", Drivers._driverInstance.FindElement(By.LinkText("Professional Services.")));
}
else
{
    Drivers._driverInstance.FindElement(By.LinkText("Professional Services.")).Click();
}
    System.Collections.ObjectModel.ReadOnlyCollection<string> handles = Drivers._driverInstance.WindowHandles;
    if (handles.Count == 2)
    {
      foreach (string handle in handles)
      {
         if (handle != BaseWindow)
         {
            string title = Drivers._driverInstance.SwitchTo().Window(handle).Title;
            Assert.AreEqual("title of the page", Drivers._driverInstance.Title);
          }
      }
     }
    else
    {
        Assert.Fail("WindowHandles returns " + handles.Count + " instead of 2");
    }
Drivers._driverInstance.SwitchTo().Window(BaseWindow);

Can someone suggest why Opera returns 4 instead of 2.

Thanks.

评论

The Opera driver doesn't return the right number of handles. This issue has already been reported to the project but it seems that the project is no longer maintained:

https://github.com/operasoftware/operachromiumdriver/issues/15

I encountered the same thing as you with Opera driver, plus (if I remember it right), the CurrentWindowHandle property doesn't work either.

Workaround:

public static void SwitchToPopup(TestTarget target, bool toPopup)
{
    if (target.IsOpera)
    {
        if (toPopup)
        {
            _windowIndex += 3;
            new WebDriverWait(target.Driver, TimeSpan.FromSeconds(DefaultTimeoutInSeconds)).Until(d => d.WindowHandles.Count > _windowIndex);
        }
        else
        {
            _windowIndex -= 3;
        }
        target.Driver.SwitchTo().Window(target.Driver.WindowHandles[_windowIndex]);
    }
    else
    {
        IEnumerable<string> windowHandles = toPopup ? target.Driver.WindowHandles : target.Driver.WindowHandles.Reverse();

        bool bFound = false;
        foreach (string windowHandle in windowHandles)
        {
            if (bFound)
            {
                target.Driver.SwitchTo().Window(windowHandle);
                break;
            }
            bFound = windowHandle == target.Driver.CurrentWindowHandle;
        }
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Order of WindowHandles
    I'm encountering an issue where WebDriver seems to change the order of WindowHandles. This causes us to close the wrong one intermittently after getting them in some cases. What seems to happen is the previously established first window handle is returned as a subsequent handle, which causes my logic to of course, close the wrong one. Is WebDriver supposed to return the window handles in the same order every time (order of first opened window to last?). This is what I initially expected, but now I'm not so sure. I should also mention the problem seems to only occur in IE right now, but I'm not
  • 窗口句柄的顺序(Order of WindowHandles)
    问题
  • New window handles disappearing in IE
    This is a follow-up to a previous question that I asked here. I previously encountered an issue with switching windows in Internet Explorer 10 using Selenium 2.37.0. My C# program would navigate to a page, click a button that opens a link, and attempt to navigate to the new window to perform additional tasks. My program kept failing, and I determined that this was because of Selenium's window handles. After opening a new window, the number of window handles (driver.WindowHandles.Count) increases from 1 to 2, as expected, but after some amount of time, the number of window handles drops back
  • Selenium Webdriver选择新窗口C#(Selenium webdriver selecting new window c#)
    问题 尝试在C#中使用Selenium WebDriver编写一些测试用例,并且有一个我不确定如何解决的方案 用户场景是在表中搜索患者,选择一个患者,然后打开一个新窗口,然后在该窗口上声明各种项目 我的问题是我无法选择新窗口来声明任何内容,它不是弹出窗口,这是一个全新的浏览器窗口,但是它没有窗口标题/名称来标识它,我将如何将驱动程序焦点切换到此窗口? 提前致谢 回答1 在Selenium WebDriver中,这真的很容易。 通过使用SwitchTo方法 driver.SwitchTo().Window(driver.WindowHandles.Last()); 也请参阅此博客文章 http://binaryclips.com/2015/03/13/selenium-webdriver-in-c-switch-to-new-window/ 回答2 这段代码对我有用。 就我而言,新窗口/选项卡是具有一定权重的PDF,因此我在加载时进行一些自定义等待。 WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); int previousWinCount = driver.WindowHandles.Count; // Perform the action to open a new Window
  • Selenium webdriver 窗口处理 c# switchTo 失败(Selenium webdriver window handles c# switchTo failed)
    问题 在测试过程中弹出 2 个窗口。 我的代码: string BaseWindow = driver.CurrentWindowHandle; ReadOnlyCollection<string> handles = driver.WindowHandles; foreach(string handle in handles) { Boolean a = driver.SwitchTo().Window(handle).Url.Contains("Main"); if (a == true) { InitialSetting.driver.SwitchTo().Window(handle); break; } } 我想切换到 url 包含“Main”的窗口。 但是当测试运行时,它会在两个窗口之间不断切换,并且不会停止。 我调试并发现即使boolean a为真, foreach也没有中断。 我该如何解决这个问题? 回答1 //switch to new window driver.FindElement(By.Id("link")).Click(); //wait for new window to open Thread.Sleep(2000); //get the current window handles string popupHandle = string.Empty
  • C# Selenium/ChromeDriver 添加用户配置文件首选项(C# Selenium/ChromeDriver Add User Profile Preference)
    问题 使用 selenium + chrome 驱动程序运行测试时,我需要允许所有 cookie。 我正在尝试使用 ChromeOptions.AddUserProfilePreference 将此添加为配置文件首选项 我不是 100% 确定允许所有 cookie 的首选项名称应该是什么。 我已经参考了这个文档 https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc?view=markup 并在我的设置中尝试了以下操作,但没有达到预期的效果。 options.AddUserProfilePreference("profile.block_third_party_cookies", false); options.AddUserProfilePreference("security.cookie_behavior", 0);``` 这是我的设置代码 new DriverManager().SetUpDriver(new ChromeConfig()); var options = new OpenQA.Selenium.Chrome.ChromeOptions { }; options.AddArgument("–no-sandbox"); options.AddArguments("
  • IE中新窗口句柄消失(New window handles disappearing in IE)
    问题 这是我在这里提出的上一个问题的后续措施。 我以前在使用Selenium 2.37.0在Internet Explorer 10中切换窗口时遇到问题。 我的C#程序将导航到页面,单击打开链接的按钮,然后尝试导航到新窗口以执行其他任务。 我的程序一直失败,并且我确定这是由于Selenium的窗口句柄造成的。 打开新窗口后,窗口句柄的数量( driver.WindowHandles.Count )从1增加到2,正如预期的那样,但是经过一段时间后,窗口句柄的数量又下降到1。 我创建了一个最小的示例网页来重现此问题。 只需将以下代码保存到桌面上名为test.aspx的文件中: <html xmlns="http://www.w3.org/1999/xhtml" > <body> <input id="btn" type="button" value="Link" lang="javascript" onclick="window.open('test.aspx')"> </body> </html> 这是我的C#代码(Visual Studio 2010中的一个控制台项目,称为TestWindowSwitching ),它打开此页面,单击按钮,并输出一些输出: using System; using System.Threading; // Needed for Sleep using
  • 硒网络驱动程序中的弹出窗口(Popup's in selenium webdrivers)
    问题 因此,我正在使用C#Winform中的Selenium firefox Webdrivers,下面有以下代码来获取弹出式窗口的句柄,该窗口在单击“ webtraffic_popup_start_button”时显示,并且它应该获取弹出式窗口的句柄,但弹出式窗口句柄是相同的作为当前的。 string current = driver.CurrentWindowHandle; driver.FindElement(By.XPath("//*[@id='webtraffic_popup_start_button']")).Click(); Thread.Sleep(Sleep_Seconds); popup = driver.CurrentWindowHandle; Thread.Sleep(3000); driver.SwitchTo().Window(current); Thread.Sleep(1000); 任何帮助,将不胜感激谢谢 这就是弹出窗口的样子。 回答1 WebDriver绝对不会跟踪任何内容以检测操作系统中哪个窗口实际上位于前台,并且在打开新的浏览器窗口时不会自动切换。 这意味着获取新打开的弹出窗口的句柄的正确方法是一个多步骤过程。 为此,您将: 将当前聚焦的窗口句柄保存到变量中,以便以后可以切换回该变量。 获取当前打开的窗口句柄的列表。
  • New window handles disappearing in IE, can't switch to new window
    I am using the latest version of Selenium (2.37.0) with C# in Internet Explorer 10 (using the latest 32-bit InternetExplorerDriver, 2.37.0) to log in to a webpage, click on a button that opens a new window, and then changes focus to the new window. Originally I was using this code in Firefox, and it would work every time: // Get handle for original window string parentHandle = driver.CurrentWindowHandle; // Click on button for new window driver.FindElement(By.Id("buttonForNewWindow")).Click(); // Get list of all window handles ReadOnlyCollection<string> allWindowHandles = driver.WindowHandles
  • 新窗口句柄在IE中消失,无法切换到新窗口(New window handles disappearing in IE, can't switch to new window)
    问题 我在Internet Explorer 10中使用带有C#的最新版本的Selenium(2.37.0)(使用最新的32位InternetExplorerDriver 2.37.0)登录到网页,单击打开新窗口的按钮,然后然后将焦点更改到新窗口。 最初,我在Firefox中使用此代码,并且每次都可以使用: // Get handle for original window string parentHandle = driver.CurrentWindowHandle; // Click on button for new window driver.FindElement(By.Id("buttonForNewWindow")).Click(); // Get list of all window handles ReadOnlyCollection<string> allWindowHandles = driver.WindowHandles; // Loop over all handles and switch to new child window foreach (string handle in allWindowHandles) { if (handle != parentHandle) { driver.SwitchTo().Window(handle); }
  • 使用Webdriver关闭除第一个标签/主标签之外的所有打开的标签(Closing all opened tabs except the first tab/main tab using webdriver)
    问题 谁能告诉我如何使用webdriver关闭除第一个标签/主标签之外的所有打开的标签? 我在下面尝试过,但它同时也关闭了所有标签,包括第一个标签。 public static void closeTabs() { String wh1=driver.getWindowHandle(); String cwh=null; while(wh1!=cwh) { new Actions(driver).sendKeys(Keys.CONTROL).sendKeys(Keys.NUMPAD1).perform(); driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL, Keys.TAB); cwh=driver.getWindowHandle(); driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL+"w"); } } 请帮我。 回答1 获取所有窗口句柄,然后遍历它们,将webdriver切换到新的句柄,然后调用close方法。 显然跳过原始手柄,然后切换回其余手柄。 就像是; String originalHandle = driver.getWindowHandle(); //Do something to open new tabs for
  • 有没有办法关闭WebDriver或Protractor中的选项卡?(Is there a way to close a tab in WebDriver or Protractor?)
    问题 是否可以通过量角器或WebDriver物理关闭选项卡? 我问是因为虽然我知道如何以编程方式切换选项卡,但它不会将活动选项卡置于前台。 我无法总是说出在SauceLabs上进行的E2E测试中发生了什么,因为当我查看屏幕投射时,它显示的是我离开的选项卡,而不是活动的选项卡。 我会错误地解决吗? it('should do something in the previous tab', function(done) { browser.getAllWindowHandles().then(function (handles) { browser.switchTo().window(handles[0]); // do something expect(something).toEqual(thisThing); done(); }); }); 回答1 您可以尝试以下操作: 切换到新打开的标签页。 关闭当前窗口(在本例中为新选项卡)。 切换回第一个窗口。 browser.getAllWindowHandles().then(function (handles) { browser.driver.switchTo().window(handles[1]); browser.driver.close(); browser.driver.switchTo().window(handles
  • 使用 switchTo() 无法使用 Selenium Webdriver 切换到新窗口(Cannot switch to new window using Selenium Webdriver using switchTo())
    问题
  • selenium web 驱动程序如何知道新窗口何时打开然后恢复执行(How can selenium web driver get to know when the new window has opened and then resume its execution)
    问题
  • 使用 C# 在 WebDriver 中打开新窗口(Opening new window in WebDriver using C#)
    问题 编辑 4: 编辑 3 编辑 2 string currentWindow = driver.CurrentWindowHandle; driver.SwitchTo().Window(""); string childTitle = driver.Title; driver.SwitchTo().Window(currentWindow); string parentTitle = driver.Title; 上面的代码为我提供了父窗口或子窗口的相同标题。 编辑: <a id="ctl00_ctl00_Features_ctl03_lnkPage" class="title" target="_blank" href="websiteaddress">Stay Around</a> 如何验证打开的新窗口的标题,一旦我验证然后关闭打开的新窗口? 所以在我的页面中,我有一个链接并单击该链接,它会打开一个新窗口,现在我不确定如何验证该窗口的标题。 这是我到目前为止所做的。 GoToMysiteUrl(); IWebElement addtoList = driver.FindElement(By.XPath(_pageName)); addtoList.Click(); //它打开一个新窗口 现在我想将焦点切换到新窗口并验证标题并将新窗口关闭回上一个窗口。 回答1 大多数人在 IE
  • Selenium ChromeDriver 开关选项卡(Selenium ChromeDriver switch tabs)
    问题 当我单击测试中的链接时,它会打开一个新选项卡。 我希望 ChromeDriver 然后专注于该选项卡。 我已尝试使用以下代码让 ChromeDriver 使用 ctrl+tab 快捷方式更改 tabas: Actions builder = new Actions(driver); builder.KeyDown(Keys.Control).KeyDown(Keys.Tab).KeyUp(Keys.Tab).KeyUp(Keys.Control);//switch tabs IAction switchTabs = builder.Build(); switchTabs.Perform(); 但这会引发以下异常: ekmLiveChat.tests.UITests.EndToEndTest.EndToEnd: System.ArgumentException : key must be a modifier key (Keys.Shift, Keys.Control, or Keys.Alt) Parameter name: key 有没有办法使用 ChromeDriver 切换标签页? 回答1 正如我在您的帖子中的评论中提到的,我不确定 Chrome 驱动程序处理选项卡的方式是否与处理窗口的方式相同。 此代码在打开新窗口时适用于 Firefox,因此希望它也适用于您的情况:
  • Selenium 从另一个选项卡而不是活动选项卡获取数据(Selenium getting data from another tab instead of active one)
    问题 我们这里有一个遗留的远程系统,它没有 webapi、webservice、... 然后我们需要通过 Selenium 进行集成。 我们需要从一个主选项卡打开多个选项卡来进行提取,但是当更改为所需的选项卡并通过 css 选择器获取值时,它总是从第一个选项卡中获得结果。 我们的系统无法在互联网上打开,然后我以 Google 为例进行了相同的操作,发生了相同的行为。 它是一个错误还是我的错? 有人可以看到有什么问题吗? 下面是一个没有错误检查的简化版本,它的代码最少。 非常感谢。 public static void testab() { IWebDriver driver = new FirefoxDriver(); driver.Navigate().GoToUrl("https://www.google.com/ncr"); IWebElement elmTxt = driver.FindElement(By.CssSelector("input#lst-ib")); elmTxt.SendKeys("google" + Keys.Enter); IWebElement elmQtdRes = driver.FindElement(By.CssSelector("div#resultStats")); string strWebStat = elmQtdRes.Text
  • Selenium:如何使Web驱动程序在执行另一项测试之前等待页面刷新(Selenium: How to make the web driver to wait for page to refresh before executing another test)
    问题 我正在用TestNG中的Selenium Web Driver编写测试用例,并且有一个场景,我要依次运行多个测试(请参阅下面的内容) @Test(priority =1) public void Test1(){ } @Test(priority =2) public void Test2(){ } 这两个测试都是AJAX调用,其中会打开一个对话框,执行测试,然后关闭对话框,然后在页面顶部显示通知消息,每次成功测试后,页面都会刷新。 问题是: Test2不等待页面刷新/重新加载。 假设Test1成功完成后,Test2将在页面刷新(即打开对话框,执行场景等)之前启动,同时页面刷新(这肯定在Test1成功执行之后发生)。 现在,由于页面刷新,由于Test2而打开的诊断框不再存在,然后Test2失败。 (而且,我不知道刷新页面需要多长时间。因此,我不想在执行Test2之前使用Thread.sleep(xxxx) ) 而且,我不认为 driver.navigate().refresh() 通过将它放在Test2之前可以解决我的问题,因为在这种情况下,我的页面将刷新两次。 问题是通过代码进行的刷新(不确定,可能需要1秒钟或3秒钟或5秒钟) 回答1 如果您正在等待元素显示,那么 在selenium rc中,我们曾经使用selenium.WaitForCondition("selenium
  • 使用Selenium的WindowHandles跟踪和迭代选项卡和窗口的最佳方法(Best way to keep track and iterate through tabs and windows using WindowHandles using Selenium)
    问题 我们正在与Selenium Webdriver一起为Internet Explorer 11进行UI测试。在经过测试的Web应用程序中,弹出几个屏幕。 在几次测试中,我们最终得到三个浏览器窗口,因此还有三个Driver.WindowHandles。 要从一个WindowHandle切换到另一个WindowHandle,我们希望将Driver.WindowHandles排序为最旧的窗口优先,最新的窗口最后。 但是事实并非如此:这完全是随机的! 因为windowhandle是GUID,所以我们最终以WindowHandle GUID为键创建了一个字典,该字典具有在浏览器窗口中加载的页面类型的值。 但这还导致例如在关闭窗口时维护字典。 对于这样一个简单的问题,这似乎是很多工作。 有更好的解决方案吗? 回答1 您说的很正确: WindowHandles的排序方式将最旧的窗口排在最前面,最新的窗口排在最后。 但是事实并非如此:这完全是随机的! 在讨论中,Simon明确提到: While the datatype used for storing the list of handles may be ordered by insertion, the order in which the WebDriver implementation iterates over the window
  • Selenium:将Internet Explorer中的文件下载到指定的文件夹,而无需直接链接,没有Windows窗体,没有AutoIt或Robot(Selenium: download file in Internet Explorer to specified folder without direct link, without Windows Forms, without AutoIt or Robot)
    问题 我经常遇到一个问题,即如何在IE中下载文件。 与Firefox的Chrome相比,您不能仅指定所需的文件夹,而是将所有文件下载到该文件夹​​。 您还需要与本机Windows窗体等进行交互。 有多个选项,例如使用AutoIt,使用键盘命令,Robot等。但是所有这些选项都不稳定,它们需要显式等待,使用冗余库以及在并行运行测试时不适当。 另一个问题是,如果文件不是通过直接链接下载的,而是从javascript命令生成的或从服务器接收的,并且无法从html提取的,该怎么办。 所有这些问题都可以解决,在这里我将展示如何做到。 解决方案是用C#编写的,我相信同样可以在Java中实现 回答1 方法DownloadFileIexplore将文件下载到指定的filePath(文件夹+文件名),例如DownloadFileExplore(“ C:\ my_folder \ report.xslx”) public void DownloadFileIexplore(string filePath) { //Click the link. //Simple click can be used instead, but in my case it didn't work for all the links, so i've replaced it with click via action