C# 使用Selenium的WindowHandles跟踪和迭代选项卡和窗口的最佳方法
我们正在与SeleniumWebDriver合作,为InternetExplorer11进行UI测试 在测试过的Web应用程序中,会弹出几个屏幕。在一些测试中,我们最终得到了三个browserswindows,以及三个Driver.WindowHandles 要从一个窗口句柄切换到另一个窗口句柄,我们希望Driver.WindowHandles会像最旧的窗口一样首先排序,最新的窗口最后排序。但事实并非如此:它完全是随机的! 因为windowhandle是一个GUID,所以我们最终创建了一个字典,其中windowhandle GUID是键,其值为browserwindow中加载的页面类型。 但这也会导致在关闭窗口时维护字典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,所以我们最终创建了一个字典,
对于这样一个简单的问题,这似乎是一个很大的工作。有更好的解决方法吗?你说得很对: 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