Selenium 简明教程

Selenium WebDriver - Windows and Tabs

Selenium Webdriver 可用于处理窗口和选项卡。Selenium Webdriver 在处理窗口和选项卡时没有区别。每个打开的窗口都有该会话的唯一标识符。

一旦打开一个新窗口,驱动程序上下文仍然保留在父窗口中。为了对子窗口执行某些任务,我们需要将驱动程序上下文从主窗口切换到子窗口。

Basic Methods to Handle Windows and Tabs in Selenium

Selenium 中有多种方法可用于基于窗口和选项卡自动执行测试。为了访问子窗口,我们必须首先使用 switchTo().window("子窗口的窗口处理 ID") 方法将驱动程序上下文切换到另一个窗口。处理窗口和选项卡的方法列在下面:

  1. driver.getWindowHandle() - 用于获取焦点窗口的窗口句柄 ID。其返回类型为 String。

  2. driver.getWindowHandles() - 用于获取所有已打开窗口的窗口句柄 ID。其返回类型为一组 String。

Example 1

让我们以下面的页面为例,我们将在其中单击 New Tab 按钮。

selenium windows tabs 1

单击 New Tab 后,我们将导航到另一个具有文本 New Tab 的选项卡。

selenium windows tabs 2

代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public class Tabs {
   public static void main(String[] args) throws InterruptedException {

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);

      // Opening the webpage where we will open a new tab
      driver.get("https://www.tutorialspoint.com/selenium/practice/browser-windows.php");

      // click link and navigate to next tab
      WebElement b = driver.findElement
         (By.xpath("/html/body/main/div/div/div[2]/button[1]"));
      b.click();

      // Get the window handle of the original window
      String oW = driver.getWindowHandle();

      // get all opened windows handle ids
      Set<String> windows = driver.getWindowHandles();

      // Iterating through all window handles
      for (String w : windows) {
         if(!oW.equalsIgnoreCase(w)) {

            // switching to child tab
            driver.switchTo().window(w);

            // accessing element in new tab
            WebElement e = driver.findElement
               (By.xpath("/html/body/main/div/div/h1"));
            System.out.println("Text in new tab is: " + e.getText());
            break;
         }
      }

      // quitting the browser
      driver.quit();
   }
}
Text in new tab is: New Tab

Process finished with exit code 0

在上面的示例中,我们在新选项卡中捕获了文本,并在控制台中收到了消息 - Text in new tab is: New Tab

最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。

Example 2

让我们以以下图像所示的示例为另一个示例,其中我们将单击 New Window Message 按钮。

selenium windows tabs 3

在点击 New Window Message 后,我们将导航到另一个窗口,该窗口包含文本 New Window Message

selenium windows tabs 4

然后,我们将关闭新窗口并切换回原始窗口,并在那里获取文本 - Browser Windows 。最后,我们将退出会话。

selenium windows tabs 5

代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.Set;
import java.util.concurrent.TimeUnit;

public class Windows {
   public static void main(String[] args) throws InterruptedException {

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);

      // Opening the webpage where we will open a new window
      driver.get("https://www.tutorialspoint.com/selenium/practice/browser-windows.php");

      // click link and navigate to next window
      WebElement b =  driver.findElement
         (By.xpath("/html/body/main/div/div/div[2]/button[3]"));
      b.click();

      // Get the window handle of the original window
      String oW = driver.getWindowHandle();

      // get all opened windows handle ids
      Set<String> windows = driver.getWindowHandles();

      // Iterating through all window handles
      for (String w : windows) {
         if(!oW.equalsIgnoreCase(w)) {

            // switching to child window
            driver.switchTo().window(w);

            // accessing element in new window
            WebElement e = driver.findElement
               (By.xpath("/html/body/main/div/div/h1"));
            System.out.println("Text in new window is: " + e.getText());
            driver.close();
            break;
         }
      }
      // switching to parent window
      driver.switchTo().window(oW);

      // accessing element in parent window
      WebElement e1 = driver.findElement
         (By.xpath("/html/body/main/div/div/div[2]/h1"));
      System.out.println("Text in parent window is: " + e1.getText());

      // quitting the browser session
      driver.quit();
   }
}
Text in new window is: New Window Message
Text in parent window is: Browser Windows

在上面的示例中,我们在新窗口中捕获文本并在控制台中收到消息 - Text in new window is: New Window Message 。然后,我们关闭子窗口并切换回父窗口。最后,在控制台中获取父窗口上的文本 - Text in parent window is: Browser Windows

Difference between close() and quit() methods

close() 方法和 quit() 方法之间是有区别的。虽然 close() 方法仅关闭焦点所在的浏览器窗口,但 quit() 方法关闭与驱动程序会话(浏览器和所有后台驱动程序进程)相关的所有内容。

Example 1 - Open New Window with Selenium 4

Selenium 4 提供了打开新标签页或窗口的选项。要打开新窗口,我们将使用该方法的帮助 −

driver.switchTo().newWindow(WindowType.WINDOW)

让我们举另一个示例,我们首先会打开一个窗口并启动一个带有文本 - Check Box 的应用程序。

selenium windows tabs 6

然后,我们将打开一个新窗口并启动另一个带有文本 - Radio Button 的应用程序。

selenium windows tabs 7

代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;

public class NewWindow {
   public static void main(String[] args) throws InterruptedException {

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);

      // Opening the webpage in window 1
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get text in window 1
      WebElement e = driver.findElement
         (By.xpath("/html/body/main/div/div/div[2]/h1"));
      System.out.println("Text is: " + e.getText());

      // Initiate the Webdriver
      WebDriver newDriver = driver.switchTo().newWindow(WindowType.WINDOW);

      // Opening the webpage in new window
      driver.get("https://www.tutorialspoint.com/selenium/practice/radio-button.php");

      // get text in window 2
      WebElement e1 = driver.findElement
         (By.xpath("/html/body/main/div/div/div[2]/form/h1"));
      System.out.println("Text in new window is: " + e1.getText());

      // quitting the browser session
      driver.quit();
   }
}
Text is: Check Box
Text in new window is: Radio Button

在上面的示例中,我们在第一个窗口中捕获文本并在控制台中收到消息 - Text is: Check Box 。然后打开另一个窗口和那里的应用程序。最后,我们在控制台的新窗口中获取文本 - Text in new window is: Radio Button

Example 2 - Open New Tab with Selenium 4

Selenium 4 提供了打开新标签页或窗口的选项。要打开新标签页,我们将使用该方法的帮助 −

driver.switchTo().newWindow(WindowType.TAB)

让我们举另一个示例,我们首先会打开一个窗口并启动一个带有文本 - Check Box 的应用程序。

selenium windows tabs 8

然后,我们将打开一个新标签页并启动另一个带有文本 - Radio Button 的应用程序。

selenium windows tabs 9

NewTabs.java 类文件上的代码实现。

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;

public class NewTabs {
   public static void main(String[] args) throws InterruptedException {

      // Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      // adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);

      // Opening the webpage in window 1
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get text in window 1
      WebElement e = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/h1"));
      System.out.println("Text is: " + e.getText());

      // Initiate the Webdriver
      WebDriver newDriver =driver.switchTo().newWindow(WindowType.TAB);

      // Opening the webpage in new tab
      driver.get("https://www.tutorialspoint.com/selenium/practice/radio-button.php");

      // get text in other tab
      WebElement e1 = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/form/h1"));
      System.out.println("Text in other tab is: " + e1.getText());

      // quitting the browser session
      driver.quit();

   }
}
Text is: Check Box
Text in other tab is: Radio Button

在上面的示例中,我们在第一个窗口中捕获文本并在控制台中收到消息 - Text is: Check Box 。然后打开另一个标签页和那里的应用程序。最后,我们在控制台的新标签页中获取文本 - Text in other tab is: Radio Button

Conclusion

这结束了我们对 Selenium WebDriver Windows 和 Tabs 教程的全面介绍。我们从描述处理 Selenium 中的窗口和标签的基本方法开始,介绍了如何使用 Selenium Webdriver 处理窗口和标签的示例,以及 Selenium 中 close() 和 quit() 方法之间的区别。这使您深入了解 Selenium WebDriver - Windows 和 Tabs。明智的做法是继续实践您所学到的内容并探索其他与 Selenium 相关的知识,以加深您的理解并拓展您的视野。