0

0

Java Selenium:如何在新标签页中执行滚动与点击操作

心靈之曲

心靈之曲

发布时间:2025-10-25 08:25:01

|

182人浏览过

|

来源于php中文网

原创

Java Selenium:如何在新标签页中执行滚动与点击操作

本教程详细讲解了在java selenium自动化测试中,当操作导致新标签页打开时,如何正确切换webdriver的控制上下文,并在新标签页中执行滚动、点击等操作。文章通过窗口句柄(window handles)的核心概念,提供了分步指南和完整的代码示例,并强调了使用等待机制和健壮定位符的最佳实践,确保自动化脚本的稳定性和可靠性。

在Selenium自动化测试中,一个常见的场景是,执行某个操作(例如点击链接)后,浏览器会打开一个新的标签页或窗口。此时,如果直接尝试在新打开的标签页上执行滚动、点击等操作,通常会发现代码无效。这是因为WebDriver的默认焦点仍然停留在原始标签页上,它并不知道新标签页已经打开,更不会自动切换过去。要解决这个问题,我们需要理解并利用Selenium的“窗口句柄”机制。

Selenium多标签页操作的挑战

WebDriver在任何给定时间点都只与一个浏览器窗口或标签页进行交互。当您的自动化脚本触发了一个新标签页的打开时,WebDriver的控制上下文并不会自动跟随到这个新标签页。因此,任何针对新标签页元素的查找或操作都会失败,抛出NoSuchElementException或类似错误。为了在新标签页中执行操作,我们必须明确地告诉WebDriver切换其焦点。

核心概念:窗口句柄(Window Handles)

每个浏览器窗口或标签页在Selenium中都有一个唯一的字符串标识符,我们称之为“窗口句柄”(Window Handle)。通过这些句柄,我们可以精确地控制WebDriver应该与哪个窗口或标签页进行交互。

  • driver.getWindowHandle(): 获取当前WebDriver焦点所在的窗口句柄。
  • driver.getWindowHandles(): 获取所有当前打开的浏览器窗口或标签页的句柄集合(Set)。
  • driver.switchTo().window(handle): 将WebDriver的焦点切换到指定的窗口句柄。

实战演练:在新标签页中执行滚动与点击

下面我们将通过一个具体的Java Selenium示例,演示如何处理新标签页,并在其中执行滚动和点击操作。

立即学习Java免费学习笔记(深入)”;

步骤一:初始化WebDriver与导航

首先,我们需要设置WebDriver并导航到目标网站。这里我们以Hepsiburada网站为例,进行初步的搜索操作。

谱乐AI
谱乐AI

谱乐AI,集成 Suno、Udio 等顶尖AI音乐模型的一站式AI音乐生成平台。

下载
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.Set;

public class NewTabScrollAndClick {

    public static void main(String[] args) throws InterruptedException {
        // 设置ChromeDriver路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\*\\Desktop\\driver\\chromedriver_win32\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // 初始化显式等待

        try {
            driver.manage().window().maximize(); // 最大化浏览器窗口
            driver.get("https://www.hepsiburada.com/"); // 导航到网站

            // 等待并点击接受Cookie按钮
            WebElement acceptCookieButton = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Kabul Et']")));
            acceptCookieButton.click();

            // 等待并输入搜索内容
            WebElement searchInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@class='desktopOldAutosuggestTheme-UyU36RyhCTcuRs_sXL9b']")));
            searchInput.sendKeys("HBCV00000ODHHV");

            // 提交搜索
            searchInput.sendKeys(Keys.ENTER);

            // 等待搜索结果页面加载
            wait.until(ExpectedConditions.urlContains("ara?q=")); // 假设URL会包含"ara?q="
            Thread.sleep(2000); // 示例中的短暂暂停,实际项目中建议使用更精确的等待

步骤二:获取当前窗口句柄并触发新标签页

在执行可能打开新标签页的操作之前,我们需要保存当前(原始)窗口的句柄。然后,我们模拟一个会打开新标签页的操作。请注意,在Hepsiburada的搜索结果页,通常点击商品链接不会打开新标签页。为了演示目的,我们假设有一个特定的链接(例如广告或外部链接)会以新标签页打开。您需要根据实际网页结构调整此处的点击操作。

            // 获取当前(原始)窗口的句柄
            String originalWindowHandle = driver.getWindowHandle();
            System.out.println("原始窗口句柄: " + originalWindowHandle);

            // 获取所有窗口句柄(在触发新标签页之前)
            Set beforeClickHandles = driver.getWindowHandles();
            System.out.println("点击前所有句柄: " + beforeClickHandles);

            // ****** 假设此处有一个操作会打开新标签页 ******
            // 例如:点击一个带有 target="_blank" 属性的链接
            // 为了演示,这里我们假设点击某个元素会打开新标签页。
            // 在实际应用中,你需要找到那个真正会打开新标签页的元素。
            // 假设我们点击一个产品图片,并且这个点击被配置为在新标签页打开(此为演示假设,实际网站可能并非如此)
            // 例如,如果有一个广告链接会打开新标签页:
            // WebElement adLink = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='ad-link' and @target='_blank']")));
            // adLink.click();
            // 或者,为了简化演示,我们模拟一个JavaScript打开新窗口的动作(不推荐在实际测试中这样做,除非测试JS行为)
            ((JavascriptExecutor) driver).executeScript("window.open('https://www.hepsiburada.com/magaza/hepsiburada-yurt-disi-satis', '_blank');");
            Thread.sleep(3000); // 给新标签页一些时间加载

步骤三:切换到新标签页

现在,新标签页应该已经打开。我们需要获取所有当前的窗口句柄,并找到那个与原始句柄不同的新句柄,然后切换到它。

            // 获取所有窗口句柄(在触发新标签页之后)
            Set afterClickHandles = driver.getWindowHandles();
            System.out.println("点击后所有句柄: " + afterClickHandles);

            String newWindowHandle = null;
            for (String handle : afterClickHandles) {
                if (!handle.equals(originalWindowHandle)) {
                    newWindowHandle = handle;
                    break;
                }
            }

            if (newWindowHandle != null) {
                // 切换到新标签页
                driver.switchTo().window(newWindowHandle);
                System.out.println("已切换到新标签页,句柄: " + newWindowHandle);
                System.out.println("新标签页URL: " + driver.getCurrentUrl());

步骤四:在新标签页中执行滚动与点击

一旦WebDriver的焦点切换到了新标签页,您就可以像操作任何普通页面一样,在新标签页中执行滚动、查找元素和点击等操作了。

                // 在新标签页中执行滚动操作
                JavascriptExecutor jse = (JavascriptExecutor) driver;
                System.out.println("在新标签页执行第一次滚动...");
                jse.executeScript("window.scrollBy(0, 300);"); // 滚动300像素
                Thread.sleep(2000); // 暂停观察效果

                // 在新标签页中查找并点击元素
                // 这里的XPath "//div[@type='comfort']" 是从原始问题中提取的,
                // 在实际新标签页中,您需要根据其具体内容和结构来确定正确的定位符。
                // 假设新标签页中有这样一个元素可以点击
                try {
                    WebElement comfortElement = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@type='comfort']")));
                    comfortElement.click();
                    System.out.println("在新标签页点击了元素: //div[@type='comfort']");
                    Thread.sleep(2000);
                } catch (Exception e) {
                    System.out.println("在新标签页中未找到或无法点击 //div[@type='comfort'] 元素。请检查XPath或页面内容。");
                }


                // 在新标签页中执行第二次滚动操作
                System.out.println("在新标签页执行第二次滚动...");
                jse.executeScript("window.scrollBy(0, 300);"); // 再次滚动300像素
                Thread.sleep(2000); // 暂停观察效果

            } else {
                System.out.println("未能找到新的标签页句柄。请检查触发新标签页的操作是否成功。");
            }

步骤五:(可选) 返回原始标签页

如果您的测试流程需要继续在原始标签页上执行操作,您可以随时切换回原始窗口。

            // 切换回原始标签页
            driver.switchTo().window(originalWindowHandle);
            System.out.println("已切换回原始标签页,句柄: " + originalWindowHandle);
            System.out.println("原始标签页URL: " + driver.getCurrentUrl());

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // driver.quit(); // 完成所有测试后关闭所有浏览器窗口
        }
    }
}

完整示例代码

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.Set;

public class NewTabScrollAndClick {

    public static void main(String[] args) throws InterruptedException {
        // 设置ChromeDriver路径
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\*\\Desktop\\driver\\chromedriver_win32\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        // 初始化显式等待,最长等待10秒
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

        try {
            driver.manage().window().maximize(); // 最大化浏览器窗口
            driver.get("https://www.hepsiburada.com/"); // 导航到网站

            // 1. 等待并点击接受Cookie按钮
            WebElement acceptCookieButton = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[text()='Kabul Et']")));
            acceptCookieButton.click();
            System.out.println("已接受Cookie.");

            // 2. 等待并输入搜索内容
            WebElement searchInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@class='desktopOldAutosuggestTheme-UyU36RyhCTcuRs_sXL9b']")));
            searchInput.sendKeys("HBCV00000ODHHV");
            System.out.println("已输入搜索内容.");

            // 3. 提交搜索
            searchInput.sendKeys(Keys.ENTER);
            System.out.println("已提交搜索.");

            // 等待搜索结果页面加载
            wait.until(ExpectedConditions.urlContains("ara?q="));
            Thread.sleep(2000); // 示例中的短暂暂停,实际项目中建议使用更精确的等待

            // 4. 获取当前(原始

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

672

2023.06.15

java流程控制语句有哪些
java流程控制语句有哪些

java流程控制语句:1、if语句;2、if-else语句;3、switch语句;4、while循环;5、do-while循环;6、for循环;7、foreach循环;8、break语句;9、continue语句;10、return语句。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

455

2024.02.23

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

722

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

725

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

394

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

398

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

441

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

427

2023.08.02

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 1.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号