Selenium 简明教程

Selenium WebDriver - Browsing Context

Selenium Webdriver 可用于浏览上下文。有多个 API 用于浏览器上下文命令。使用浏览上下文可以执行的一些操作包括打开新窗口、标签页、利用已打开的窗口、打开 URL 等。

Create Browsing Context

要创建浏览上下文,我们将使用 ChromeOptions 类,然后将功能 webSocketUrl 设置为 true 值,并将它的引用传递给 Webdriver。请注意,我们还需要导入以下语句才能使用浏览上下文的这些方法。

import org.openqa.selenium.bidi.browsingcontext.BrowsingContext.

在使用浏览上下文命令的 API 运行测试时,将打开一个带有 title BiDi-CDP Mapper 并带有消息 - BiDi-CDP Mapper is controlling this tab along with the debug information 的标签页。这将证明自动化测试正在使用浏览上下文。

selenium webdriver browsing context 1

下一个标签页会打开由自动化测试触发的应用程序。

selenium webdriver browsing context 2

Selenium 中的浏览上下文是一个从 Selenium 4.x 版本开始提供的功能。要利用浏览器上下文命令中的所有 API,建议使用 Selenium 4.16.x 版本中的 Selenium Maven 依赖。

要添加到 pom.xml 的浏览上下文依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">

   <modelVersion>4.0.0</modelVersion>
   <groupId>org.example</groupId>
   <artifactId>SeleniumJava</artifactId>
   <version>1.0-SNAPSHOT</version>

   <properties>
      <maven.compiler.source>16</maven.compiler.source>
      <maven.compiler.target>16</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>

   <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
   <dependencies>
      <dependency>
         <groupId>org.seleniumhq.selenium</groupId>
         <artifactId>selenium-java</artifactId>
         <version>4.16.1</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/org.testng/testng -->
      <dependency>
         <groupId>org.testng</groupId>
         <artifactId>testng</artifactId>
         <version>7.9.0</version>
         <scope>test</scope>
      </dependency>
   </dependencies>
</project>

Create Browsing Context in New Window and Navigate to URL

让我们看一个示例,在该示例中,我们将打开一个浏览器,然后打开另一个新窗口并启动一个包含以下 URL 的应用程序以创建浏览上下文 -

BrowsingContextNewWindows.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.NavigationResult;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // open browsing context in new window
      BrowsingContext bc = new BrowsingContext(driver, WindowType.WINDOW);

      // obtain id of browsing context in new window
      String text = bc.getId();
      System.out.println("Id of browsing context in new window: " + text);

      // navigate to new url in the new window
      NavigationResult i = bc.navigate("https://www.tutorialspoint.com/selenium/practice/buttons.php");

      // get new URL opened in the new window
      System.out.println("Get URL: " + i.getUrl());

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Id of browsing context in new window:
14CC57B70B48D044482821778B560618
Get URL:
https://www.tutorialspoint.com/selenium/practice/buttons.php

Process finished with exit code 0

在上面的示例中,我们打开了一个浏览器,然后打开了另一个新窗口并启动了一个包含以下 URL 的应用程序以创建浏览上下文。我们获取了新窗口的浏览上下文 id 并在控制台中启动带有消息 - Id of browsing context in new window: 14CC57B70B48D044482821778B560618Get URL: https://www.tutorialspoint.com/selenium/ 的 URL。

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

Create Browsing Context in New Tab and Navigate to URL

让我们看一个示例,在该示例中,我们将打开一个浏览器,然后打开另一个新标签页并在其中启动一个包含以下 URL 的应用程序以创建浏览上下文 - https://www.tutorialspoint.com/selenium/

BrowsingContextNewTabs.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.NavigationResult;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // open browsing context in new tab
      BrowsingContext bc = new BrowsingContext(driver, WindowType.TAB);

      // obtain id of browsing context in new tab
      String text = bc.getId();
      System.out.println("Id of browsing context in new tab: " + text);

      // navigate to new url in the new tab in readiness state
      NavigationResult i = bc.navigate("https://www.tutorialspoint.com/selenium/practice/buttons.php",
      ReadinessState.COMPLETE);

      // get new URL opened in the new tab
      System.out.println("Get URL: " + i.getUrl());

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Id of browsing context in new tab:
E7D9C6C1EA830EE2E968EFFDAE800EE2
Get URL:
 https://www.tutorialspoint.com/selenium/practice/buttons.php

Process finished with exit code 0

在上面的示例中,我们打开了一个浏览器,然后打开了一个新标签页并在其中启动了一个包含以下 URL 的应用程序以创建浏览上下文。我们获取了新标签页的浏览上下文 id 并在控制台中启动带有消息 - Id of browsing context in new tab: E7D9C6C1EA830EE2E968EFFDAE800EE2Get URL: https://www.tutorialspoint.com/selenium/ 的 URL。

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

Create Browsing Context Using Existing Window/Tab Handle

让我们看一个示例,在该示例中,我们将使用现有的窗口/标签页创建浏览上下文。

BrowsingContextNewTab.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();

      // open browsing context in new tab/window
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // obtain id of browsing context in new tab/window
      String text = bc.getId();
      System.out.println("Id of browsing context in new tab/window: " + text);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Id of browsing context in new tab/window:
E5EB8BA6EBAFBA14561CC8EB23360034

Process finished with exit code 0

在上面的示例中,我们使用现有的窗口/标签页句柄创建了浏览上下文。我们通过消息 - Id of browsing context in new/window: E5EB8BA6EBAFBA14561CC8EB23360034 从控制台中获取了浏览上下文 id。

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

Create Browsing Context After Opening New Window Having Reference Browsing Context

让我们看一个示例,在该示例中,我们将通过打开具有引用浏览上下文的窗口创建浏览上下文。

BrowsingContextNewWindow.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();

      // open browsing context in new window using  browsing context
      BrowsingContext bc = new BrowsingContext(driver, WindowType.WINDOW, windowID);

      // obtain id of browsing context
      String text = bc.getId();
      System.out.println("Id of browsing context in new window: " + text);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Id of browsing context in new window:
F82CF86144C26AEA4168F672C11B8C92

Process finished with exit code 0

在上面的示例中,我们通过打开一个具有引用浏览上下文的窗口来创建浏览上下文。我们通过消息 - Id of browsing context in window: F82CF86144C26AEA4168F672C11B8C92 从控制台中获取了浏览上下文 id。

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

Create Browsing Context After Opening New Tab Having Reference Browsing Context

让我们举一个例子,在这个例子中,我们会通过打开一个带有参考浏览上下文的标签页,来创建一个浏览上下文。

BrowsingContextNewTab.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();

      // open browsing context in new tab using browsing context
      BrowsingContext bc = new BrowsingContext(driver, WindowType.TAB, windowID);

      // obtain id of browsing context
      String text = bc.getId();
      System.out.println("Id of browsing context in new tab: " + text);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Id of browsing context in new tab:
C88F54A24AF3C6DE71C5B5E37913BA77

Process finished with exit code 0

在上面的例子中,我们在打开一个带有参考浏览上下文的标签页之后,创建了浏览上下文。我们在控制台中通过消息 - Id of browsing context in tab: C88F54A24AF3C6DE71C5B5E37913BA77 ,获得了浏览上下文 ID。

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

Get the Browsing Context Tree

让我们举一个例子,在这个例子中,我们将从父浏览上下文开始,获得每个浏览上下文。

BrowsingContextTree.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.util.List;
import java.util.concurrent.TimeUnit;
public class BrowsingContextTree {
   public static void main(String[] args) throws InterruptedException {

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();

      // open browsing context in new tab/window
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // open another URL
      bc.navigate("https://www.tutorialspoint.com/selenium/practice/buttons.php", ReadinessState.COMPLETE);

      // list of browsing context tree
      List<BrowsingContextInfo> tree = bc.getTree();

      // obtain total browsing context tree
      int size = tree.size();
      System.out.println("Total browsing contexts: " + size);

      // obtain total children
      BrowsingContextInfo c = tree.get(0);
      int size1 = c.getChildren().size();
      System.out.println("Total children: " + size1);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Total browsing contexts: 1
Total children: 0

Process finished with exit code 0

Get the Browsing Context Tree with Depth Value

让我们举一个例子,在这个例子中,我们将从父浏览上下文开始,获得每个浏览上下文,以及深度值。

BrowsingContextTreeDepth.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import java.util.List;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();
      System.out.println("Window Handle Id: " + windowID);

      // open browsing context in new tab/window
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // open another URL
      bc.navigate("https://www.tutorialspoint.com/selenium/practice/buttons.php", ReadinessState.COMPLETE);

      // list of browsing context tree with depth value
      List<BrowsingContextInfo> tree = bc.getTree(0);

      // obtain total browsing context tree
      int size = tree.size();
      System.out.println("Total browsing contexts: " + size);

      // obtain total children
      BrowsingContextInfo c = tree.get(0);
      List children = c.getChildren();
      System.out.println("Total children: " + children);
      System.out.println("Browsing Context id: " + c.getId());

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Window Handle Id: DE5E963CFFCC9A42A5F7A4903BF0C12C
Total browsing contexts: 1
Total children: null
Browsing Context id: DE5E963CFFCC9A42A5F7A4903BF0C12C

Process finished with exit code 0

Get All the Top Level Browsing Contexts

让我们举一个例子,在这个例子中,我们将获得每个顶级浏览上下文。

BrowsingContextTopLevel.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();

      // open browsing context in new tab/window
      BrowsingContext bc1 = new BrowsingContext(driver, windowID);

      // open another browsing context in new window
      BrowsingContext bc2 = new BrowsingContext(driver, WindowType.WINDOW);

      // list of every top level browsing contexts
      List<BrowsingContextInfo> tree = bc1.getTopLevelContexts();

      // obtain total browsing context tree
      int size = tree.size();
      System.out.println("Total top level browsing context: " + size);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Total top level browsing context: 2

Process finished with exit code 0

在上面的例子中,我们在控制台中通过消息 - Total top level browsing context: 2 ,获得了所有的顶级浏览上下文。

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

Close a Window Browsing Context

让我们举一个例子,在这个例子中,我们将使用 close() 方法关闭一个窗口浏览上下文。

BrowsingContextWindowClose.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // open browsing context in new window
      BrowsingContext bc1 = new BrowsingContext(driver, WindowType.WINDOW);

      // open another browsing context in new window
      BrowsingContext bc2 = new BrowsingContext(driver, WindowType.WINDOW);

      // list of every top level browsing contexts
      List<BrowsingContextInfo> tree = bc1.getTopLevelContexts();

      // obtain total browsing context tree
      int size = tree.size();
      System.out.println("Total top level browsing context before closing: " + size);

      // close one browsing context
      bc2.close();

      // obtain total browsing context tree after closing one
      List<BrowsingContextInfo> tree1 = bc1.getTopLevelContexts();
      int size1 = tree1.size();
      System.out.println("Total top level browsing context after closing: " + size1);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Total top level browsing context before closing: 3
Total top level browsing context after closing: 2

Process finished with exit code 0

Close a Tab Browsing Context

让我们举一个例子,在这个例子中,我们将使用 close() 方法关闭一个标签页浏览上下文。

BrowsingContextTabClose.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContextInfo;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // open browsing context in new tab
      BrowsingContext bc1 = new BrowsingContext(driver, WindowType.TAB);

      // open another browsing context in new tab
      BrowsingContext bc2 = new BrowsingContext(driver, WindowType.TAB);

      // list of every top level browsing contexts
      List<BrowsingContextInfo> tree = bc1.getTopLevelContexts();

      // obtain total browsing context tree
      int size = tree.size();
      System.out.println("Total top level browsing context before closing: " + size);

      // close one browsing context
      bc2.close();

      // obtain total browsing context tree after closing one
      List<BrowsingContextInfo> tree1 = bc1.getTopLevelContexts();
      int size1 = tree1.size();
      System.out.println("Total top level browsing context after closing: " + size1);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Total top level browsing context before closing: 3
Total top level browsing context after closing: 2

Process finished with exit code 0

Activate a Browsing Context

让我们举一个例子,在这个例子中,我们将使用 activate() 方法激活一个浏览上下文。

BrowsingContextTabClose.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // get window handle id
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc1 = new BrowsingContext(driver, windowID);

      // open another browsing context in new window
      BrowsingContext bc2 = new BrowsingContext(driver, WindowType.WINDOW);

      // activate browsing context
      bc1.activate();

      // Quitting browser
      driver.quit();
   }
}

Reload a Browsing Context

让我们举一个例子,在这个例子中,我们将重新加载一个浏览上下文,并获得导航 ID 和 URL。

BrowsingContextReload.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.NavigationResult;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");

      // open browsing context in new tab
      BrowsingContext bc = new BrowsingContext(driver, WindowType.TAB);

      // navigate to URL in a browsing context
      bc.navigate("https://www.tutorialspoint.com/selenium/practice/buttons.php", ReadinessState.COMPLETE);

      // reload browsing context
      NavigationResult load = bc.reload(ReadinessState.INTERACTIVE);

      // get navigation id
      String text = load.getNavigationId();
      System.out.println("Navigation ID: " + text);

      // get URL opened in browsing context
      String url = load.getUrl();
      System.out.println("Navigation URL: " + url);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Navigation ID: 0C12BD5C26E08392DB18F6C7928F8020
Navigation URL:
https://www.tutorialspoint.com/selenium/practice/buttons.php

Process finished with exit code 0

在上面的例子中,我们已经重新加载了浏览上下文,并通过控制台中的消息 - Navigation ID: 0C12BD5C26E08392DB18F6C7928F8020Navigation URL: https://www.tutorialspoint.com/selenium/ ,获得了导航 ID 和 URL。

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

Handle User Prompts with Browsing Context

让我们举一个例子,在这个例子中,我们将使用 handleUserPrompt() 方法,通过浏览上下文处理用户提示。

BrowsingContextHandlePrompt.java 中的代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/alerts.php");

      // get window handle
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc = new BrowsingContext(driver, driver.getWindowHandle());

      // identify button
      WebElement btn = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/div[1]/button"));
      btn.click();

      // accept and input text in prompt
      bc.handleUserPrompt(true, "Tutorialspoint");

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Process finished with exit code 0

在上面的示例中,我们已经使用 Browsing Context 处理了用户提示。

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

Capture Screenshots with Browsing Context

让我们举一个示例,在该示例中,我们将使用 captureScreenshot() 方法通过浏览上下文捕获屏幕截图。

BrowsingContextCaptureScreenshot.java 中的代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/alerts.php");

      // get window handle
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc = new BrowsingContext(driver, driver.getWindowHandle());

      // identify button then click
      WebElement btn = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/div[1]/button"));
      btn.click();

      // capture screenshot
      String sc = bc.captureScreenshot();

      // get number of screenshot
      int size = sc.length();
      System.out.println("Size of Screenshot: " + size);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Size of Screenshots: 209152

Process finished with exit code 0

Capture a Screenshot of an Element with Browsing Context

让我们举一个示例,在该示例中,我们将使用 captureElementScreenshot() 方法通过浏览上下文捕获元素的屏幕截图。

BrowsingContextElemntCaptureScreenshot.java 中的代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebElement;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // get window handle
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/alerts.php");

      // identify button
      WebElement btn = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/div[1]/button"));

      String sc = bc.captureElementScreenshot(((RemoteWebElement) btn).getId());

      // get number of screenshot
      int size = sc.length();
      System.out.println("Size of Screenshot of an element: " + size);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Size of Screenshot of an element: 3080

Process finished with exit code 0

Set the Viewport Pixel with Browsing Context

让我们举一个示例,在该示例中,我们将使用 setViewport() 方法通过浏览上下文设置一个像素视区。

SetViewPort.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // get window handle
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/alerts.php");

      // set view port
      bc.setViewport(200, 600, 6);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Process finished with exit code 0

Print a Page with Browsing Context

让我们举一个示例,在该示例中,我们将使用 print() 方法通过浏览上下文打印页面。

PrintPage.java 中的代码实现

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.print.PrintOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // get window handle
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // launching a browser and open a URL
      driver.get("https://www.tutorialspoint.com/selenium/practice/alerts.php");

      // object of PrintOptions
      PrintOptions p = new PrintOptions();

      // get print
      String print = bc.print(p);

      // Quitting browser
      driver.quit();
   }
}

Navigate, Move Forward, Backward, and Traverse in Browser History with Browsing Context

让我们举一个示例,我们在其中使用浏览上下文在浏览器历史记录中向前、向后移动和遍历。这些操作使用 BrowsingContext 类的 forward()、back() 和 traverse(-1) 方法执行。

BrowsingContextHistory.java 中的代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.bidi.browsingcontext.BrowsingContext;
import org.openqa.selenium.bidi.browsingcontext.ReadinessState;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.concurrent.TimeUnit;

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

      // object of ChromeOptions
      ChromeOptions opt = new ChromeOptions();
      opt.setCapability("webSocketUrl", true);

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

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

      // get window handle
      String windowID = driver.getWindowHandle();

      // open browsing context
      BrowsingContext bc = new BrowsingContext(driver, windowID);

      // navigate to URL
      bc.navigate("https://www.tutorialspoint.com/selenium/practice/login.php", ReadinessState.COMPLETE);

      // identify element then click
      WebElement btn = driver.findElement(By.xpath("//*[@id='signInForm']/div[3]/a"));
      btn.click();

      // get page title after click
      String title = driver.getTitle();
      System.out.println("Page title after click: " + title);

      // navigate back in browser history
      bc.back();

      // get page title after navigating back in browser history
      String title1 = driver.getTitle();
      System.out.println("Page title after navigating back in browser history: " + title1);

      // navigate forward in browser history
      bc.forward();

      // get page title after navigating forward in browser history
      String title2 = driver.getTitle();
      System.out.println("Page title after navigating forward in browser history: " + title2);


      // traverse history
      bc.traverseHistory(-1);

      // Quitting browser
      driver.quit();
   }
}

它将显示以下内容 output

Page title after click: Selenium Practice - Register
Page title after navigating back in browser history: Selenium Practice - Login
Page title after navigating forward in browser history: Selenium Practice - Register

Process finished with exit code 0

在上面的示例中,我们启动了一个应用程序并在浏览器历史记录中向后和向前导航,并在控制台中使用消息 - Page title after click: Selenium Practice - Register, Page title after navigating back in browser history: Selenium Practice - LoginPage title after navigating forward in browser history: Selenium Practice - Register 获取导航后的浏览器标题。

这结束了我们对 Selenium WebDriver - 浏览器上下文教程的全面了解。我们首先介绍了什么是浏览器上下文以及浏览器上下文所需的 Selenium 依赖项,然后通过示例在新的窗口和标签中、在新窗口中以及使用现有窗口句柄在标签中创建浏览器上下文,导航到常规和就绪状态的 URL,获取浏览上下文树、其深度以及所有顶级浏览上下文,关闭标签或窗口,激活并重新加载浏览上下文,处理用户提示,捕获网页和特定元素的屏幕截图,使用像素设置视口,打印页面,并在浏览器历史记录中使用 Selenium 向前、向后和遍历导航。

这使您对 Selenium WebDriver - 浏览器上下文有了深入的了解。明智的做法是继续实践您所学的内容并探索与 Selenium 相关的其他内容,以加深您的理解并拓宽您的视野。