当前位置: 首页 > 知识库问答 >
问题:

不清楚driver.getwindowhandles()和driver.getwindowhandle()

钱震博
2023-03-14

嗨,我正在学习Selenium&我不太清楚上面两个函数是如何工作的:问题陈述:

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

单击链接>多个窗口一个窗口打开>单击>>单击此处另一个窗口打开>>从该窗口获取文本并打印,然后返回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()并为每个窗口打印它,它的值保持不变,那么这个方法是否总是返回父窗口,或者它的工作方式不同。

Ques2)当我使用driver.getWindoWhandles()时,它会返回集合中的2个值。driver.getWindoWhandles()是否也会返回父窗口。(我不确定应该有2个还是3个值,因为我有3个URL,我认为集合应该有3个)

Ques3)有人能分享使用多个子窗口ID的最有效方法吗:

使用迭代器方法Set人们还将Set转换为Arraylist然后使用get方法。[哪种方式更好]

代码:

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();

共有1个答案

席波娃
2023-03-14
            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

为了回答你的问题

窗口句柄由操作系统(Windows)自动且唯一地分配给每个新打开的窗口

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

Q2-->导航不会改变句柄。它不是特定于页面的,而是特定于窗口的。getWindowHandles将返回当前正在运行的WebDriver实例打开的所有打开的浏览器窗口。已经打开的窗口不包括在内。

Q3-->使用上面演示的for循环,打开窗口,找到不是父窗口句柄的ID,并将其存储在一个变量中。对更多窗口重复此过程。

 类似资料:
  • 我有一个badtokenexception的报告,尽管我尝试了任何事情,但我无法复制它,对我来说也不清楚它是如何发生的。 BadTokenException(@Android.view.viewrootimpl:setView:575)通过(@Android.view.WindowmanagerGlobal:AddView:272)完整跟踪:Android.view.Windowmanager$B

  • 我只是在尝试学习如何将基于intellij构建的java应用程序打包并安装到PC上。 我使用“C:\ProgramFiles(x86)\OpenJava\openjdk-15.0.2\U windows-x64\U bin\jdk-15.0.2”在intellij中构建了hello world,并在开发环境中运行。 如果我理解Launch4j,我可以在JRE选项卡中指定捆绑的JRE,这样我就不依赖

  • 我已经开始做一个JavaFX项目,并且我已经按照这个问题中的设置说明进行了操作:IntelliJ无法使用VSCode识别JavaFX11和OpenJDK11。我用的是苹果笔记本电脑。 到了最后一部分,我要用settings.json和launch.json设置东西。我尽可能严格地按照说明操作,但错误:

  • 我试图理解spark 3中的新特性:动态分区修剪。 看看这个测试: https://github.com/apache/spark/blob/master/sql/core/src/test/scala/org/apache/spark/sql/DynamicPartitionPruningSuite.scala#L257 我不明白为什么它是动态的并且要经典的修剪? 谢谢

  • 当我尝试重新绘制透明窗口并在其上绘制矩形时,之前的矩形将保留。目标是通过单击并移动鼠标在屏幕上选择一个区域。如果你移动鼠标一会儿,它会看起来像这样 通过去除透明度,效果很好。 我尝试了在Stack Overflow上找到的关于这个主题的所有内容,但我无法让它在Windows和Linux上运行。 谢谢:)