gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:45:58 24 4
gpt4 key购买 nike

我们正在与 Selenium webdriver 合作,为 Internet Explorer 11 进行 UI 测试。在测试的 Web 应用程序中,会弹出几个屏幕。在一些测试中,我们最终得到了三个浏览器窗口,因此也得到了三个 Driver.WindowHandles。为了从一个 WindowHandle 切换到另一个,我们期望 Driver.WindowHandles 的排序方式是最旧的窗口在前,最新的窗口在最后。但事实并非如此:它完全是随机的!

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

对于这么简单的事情来说,似乎需要做很多工作。有没有更好的解决方案?

最佳答案

你说得非常正确:

WindowHandles would be sorted like the oldest windows first and the newest windows last. But this is not the case: It is totaly random!

在一次讨论中,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 handles to insert them has no requirement to be stable. The ordering is arbitrary.

因此,我们将引发 WebDriverWait ,然后每次打开新选项卡/窗口时收集窗口句柄,最后迭代窗口句柄和 switchTo().window(newly_opened) 根据需要:

Please adjust the Test Environment if needed [My configuration - Selenium: 3.5.3, IEDriverServer: 3.5.0.0 (64-bit), IE: v10.0]

Java:

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
<小时/>

片尾

您可以找到基于Open web in new tab Selenium + Python中的讨论

关于c# - 使用 Selenium 使用 WindowHandles 跟踪和迭代选项卡和窗口的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59840088/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com