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网站为例,进行初步的搜索操作。

LibLibAI
LibLibAI

国内领先的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. 获取当前(原始

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

183

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

286

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

258

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

124

2025.08.07

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1500

2023.10.24

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

17

2026.01.28

热门下载

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

精品课程

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

共58课时 | 4.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

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

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