Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Selenium的WindowHandles跟踪和迭代选项卡和窗口的最佳方法_C#_Selenium_Selenium Webdriver_Webdriverwait_Window Handles_Python - Fatal编程技术网

C# 使用Selenium的WindowHandles跟踪和迭代选项卡和窗口的最佳方法

C# 使用Selenium的WindowHandles跟踪和迭代选项卡和窗口的最佳方法,c#,selenium,selenium-webdriver,webdriverwait,window-handles,python,C#,Selenium,Selenium Webdriver,Webdriverwait,Window Handles,Python,我们正在与SeleniumWebDriver合作,为InternetExplorer11进行UI测试 在测试过的Web应用程序中,会弹出几个屏幕。在一些测试中,我们最终得到了三个browserswindows,以及三个Driver.WindowHandles 要从一个窗口句柄切换到另一个窗口句柄,我们希望Driver.WindowHandles会像最旧的窗口一样首先排序,最新的窗口最后排序。但事实并非如此:它完全是随机的! 因为windowhandle是一个GUID,所以我们最终创建了一个字典,

我们正在与SeleniumWebDriver合作,为InternetExplorer11进行UI测试 在测试过的Web应用程序中,会弹出几个屏幕。在一些测试中,我们最终得到了三个browserswindows,以及三个Driver.WindowHandles 要从一个窗口句柄切换到另一个窗口句柄,我们希望Driver.WindowHandles会像最旧的窗口一样首先排序,最新的窗口最后排序。但事实并非如此:它完全是随机的!

因为windowhandle是一个GUID,所以我们最终创建了一个字典,其中windowhandle GUID是键,其值为browserwindow中加载的页面类型。 但这也会导致在关闭窗口时维护字典


对于这样一个简单的问题,这似乎是一个很大的工作。有更好的解决方法吗?

你说得很对:

WindowHandles的排序将与最旧的窗口优先,最新的窗口最后一样。但事实并非如此:它完全是随机的

在一次讨论中,Simon明确提到:

虽然用于存储句柄列表的数据类型可以按插入顺序排列,但WebDriver实现迭代窗口句柄以插入它们的顺序不需要稳定。排序是任意的。

因此,我们将引导一个
WebDriverWait
,然后每次打开新选项卡/窗口时收集窗口句柄,最后遍历窗口句柄和
switchTo()。窗口(新打开的)
,根据需要:

如果需要,请调整测试环境[My configuration-
Selenium
:3.5.3
IEDriverServer
:3.5.0.0(64位)
IE
:v10.0
]

爪哇:
奥特罗
您可以在

中找到基于的讨论,我对C不太熟悉,但可以通过Java构建答案。这符合你的问题吗?是的,没问题。谢谢你的回答。但是当有第三个或第四个窗口时,它是如何工作的呢?嗨,Debanjan,我最初的问题是关于3个窗口句柄。所以我不能接受你的回答。我知道你可以在两个窗口句柄之间切换,但棘手的是当有两个以上的句柄时。@KoenMeijer用
如何处理3个窗口句柄更新了我的答案。如果这能回答您的问题,请告诉我。谢谢Debanjan,因此您还必须跟踪对象中的所有WindowHandle。当您关闭窗口时,还必须删除winodwhandle。在我看来,对于这样一件简单的事情,要做的工作似乎很多。这个问题没有别的解决办法吗?
package demo;

import java.util.Iterator;
import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class NEW_TAB_Handling {

    public static void main(String[] args)  {


        System.setProperty("webdriver.ie.driver", "C:\\Utility\\BrowserDrivers\\IEDriverServer.exe");
        WebDriver driver =  new InternetExplorerDriver();
        driver.get("http://www.google.com");
        String first_tab = driver.getWindowHandle();
        System.out.println("Working on Google");
        ((JavascriptExecutor) driver).executeScript("window.open('http://facebook.com/');");
        WebDriverWait wait = new WebDriverWait(driver,5);
        wait.until(ExpectedConditions.numberOfWindowsToBe(2));
        Set<String> s1 = driver.getWindowHandles();
        Iterator<String> i1 = s1.iterator();
        while(i1.hasNext())
        {
            String next_tab = i1.next();
            if (!first_tab.equalsIgnoreCase(next_tab))
            {
                driver.switchTo().window(next_tab);

                System.out.println("Working on Facebook");
            }
        }
        String second_tab = driver.getWindowHandle();
        ((JavascriptExecutor) driver).executeScript("window.open('http://youtube.com/');");
        wait.until(ExpectedConditions.numberOfWindowsToBe(3));
        Set<String> s2 = driver.getWindowHandles();
        Iterator<String> i2 = s2.iterator();
        while(i2.hasNext())
        {
            String next_tab = i2.next();
            if (!first_tab.equalsIgnoreCase(next_tab) && !second_tab.equalsIgnoreCase(next_tab))
            {
                driver.switchTo().window(next_tab);
                System.out.println("Working on Youtube");
            }
        }
        driver.quit();
        System.out.println("Quit the WebDriver instance");
    }
}
Working on Google
Working on Facebook
Working on Youtube
Quit the WebDriver instance