使用selenium的windowhandles跟踪和遍历选项卡和窗口的最佳方法

eni9jsuy  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(403)

我们正在与seleniumwebdriver合作,为internetexplorer11进行ui测试。  在测试过的webapplication中,出现了几个屏幕。在几个测试中,我们得到了三个browserswindows,以及三个driver.windowhandles。  要从一个windowhandle切换到另一个windowhandle,我们希望driver.windowhandles会像最旧的窗口一样先排序,最新的窗口最后排序。但事实并非如此:这完全是随机的! 
因为windowhandle是一个guid,所以我们最终创建了一个字典,其中windowhandle guid是键,其值是browserwindow中加载的页面类型的值。但这也会导致在关闭窗口时维护字典。 
对于这样一件简单的事情来说,这似乎是一项艰巨的工作。有没有更好的解决办法?

rslzwgfq

rslzwgfq1#

你说得很对:
窗口句柄的排序方式与最旧窗口的排序方式相同。但事实并非如此:这完全是随机的!
在一次讨论中,西蒙明确提到: 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) 按要求:
请调整一下 Test Environment 如果需要[我的配置- Selenium : 3.5.3, IEDriverServer :3.5.0.0(64位), 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

奥特罗

您可以在openweb的新选项卡selenium+python中找到基于python的讨论

相关问题