不清楚 driver.getWindowHandles() & driver.getWindowHandle()

Unclear about driver.getWindowHandles() & driver.getWindowHandle()

大家好,我正在学习 Selenium,我不太清楚以上两个函数是如何工作的: 问题陈述:

我有一个练习作业说:转到http://the-internet.herokuapp.com/

点击一个link>多个Windows一个Window打开>点击>>点击这里另一个Window打开>>从这个window抓取文本并打印 之后返回此 http://the-internet.herokuapp.com/windows 并打印文本。

流量:http://the-internet.herokuapp.com/>>>http://the-internet.herokuapp.com/windows>>>http://the-internet.herokuapp.com/windows/new

Que1) 如果我使用 driver.getWindowHandle() 并为每个 window 打印它,它的值保持不变,所以此方法总是 returns parent window 或者它的工作方式不同。

Ques2) 当我使用 driver.getWindowHandles() 时,它是 returning 集合中的 2 个值。 driver.getWindowHandles() return parent window 也是如此。 (我不确定是否应该有 2 个或 3 个值,因为我有 3 个 URL,我认为该集合应该有 3 个)

问题 3) 有人可以分享使用多个 child window id 的最有效方法吗:

Set with iterator method People also convert Set to Arraylist and then use get method. [which is a better way]

代码:

driver.get("http://the-internet.herokuapp.com/");
        String p1=driver.getWindowHandle();
        System.out.println(p1);
        text1=driver.findElement(By.xpath("//a[@href='/windows']"));
        text1.click();
        WebElement 
        text2=driver.findElement(By.xpath("//a[@href='/windows/new']"));
        text2.click();
        Set<String> child=driver.getWindowHandles();
        System.out.println(child.size());
        ArrayList<String> children=new ArrayList<String>(child);
        System.out.println(children);
        driver.switchTo().window(children.get(1));
        System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
        driver.close();
        driver.switchTo().window(children.get(0));
        System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
        driver.switchTo().window("");
        System.out.println(driver.getCurrentUrl());
        driver.close();

您可以在 documentation 中看到 getWindowHandle()getWindowHandles() 方法之间的主要区别:

getWindowHandle(): Return 此 window 的不透明句柄,可在此驱动程序实例中唯一标识它。

getWindowHandles(): Return 一组 window 句柄,可用于通过将它们传递给 [=14] 来迭代此 WebDriver 实例的所有打开 windows =]

简单来说,driver.getWindowHandles() 存储同时打开的所有页面的句柄集,但 driver.getWindowHandle() 获取焦点所在网页的句柄。它获取活动浏览器的地址,它有一个 return 类型的字符串。

            driver.get("http://the-internet.herokuapp.com/");
            String p1=driver.getWindowHandle(); //Gets the newly opened and the only window handle

            System.out.println("This is parent window handle " + p1);
            text1=driver.findElement(By.xpath("//a[@href='/windows']"));
            text1.click(); //Navigates, no new window opened. Handle remains the same

            //WebElement 'Unnecessary code

            text2=driver.findElement(By.xpath("//a[@href='/windows/new']"));
            text2.click(); //opens second window/tab as per the settings. there are 2 window handles here for current driver instance
            Set<String> child=driver.getWindowHandles(); //set of 2
            System.out.println(child.size());
    //          ArrayList<String> children=new ArrayList<String>(child);' modifying this
            
             String strSecondWindowHandle = "";
             for(String str : s) // as set is not an ordered collection we need to loop through it to know which position holds which handle. 
            {
                if(str.equalsIgnoreCase(p1) == false) //to check if the window handle is not equal to parent window handle
                {
                         driver.switchTo().window(str) // this is how you switch to second window
                         strSecondWindowHandle = str;
                         break;
                }
            }
//            System.out.println(children);
//            driver.switchTo().window(children.get(1)); //not required
            System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
            driver.close(); // now this will close the second window
            driver.switchTo().window(p1); // switches to main window
            System.out.println(driver.findElement(By.xpath("//div[@class='example']/h3")).getText());
//            driver.switchTo().window(""); //not required as it is the same window
            System.out.println(driver.getCurrentUrl());
            driver.close(); //closes the main window

所以回答你的问题

Window 句柄由操作系统 (Windows) 自动唯一分配给每个新打开的 window

Q1 --> 除非您明确切换 windows,否则 window 句柄保持不变。切换是这里的关键。

Q2 --> 导航不会更改句柄。它不是特定于页面的,而是特定于 window 的。 getWindowHandles 将 return 当前 运行 WebDriver 实例打开的所有打开的浏览器 windows。已开放 windows 不包括在内。

Q3 --> 使用上面演示的for循环,你打开window,找到不是你父window句柄的ID,将其存储在变量中。对更多 windows.

重复此过程