0

0

使用 Java Selenium 精准点击 Google 搜索结果与导航

心靈之曲

心靈之曲

发布时间:2025-11-06 14:47:01

|

1071人浏览过

|

来源于php中文网

原创

使用 java selenium 精准点击 google 搜索结果与导航

本教程详细介绍了如何使用 Java Selenium WebDriver 自动化 Google 搜索过程,包括处理 Cookie 同意弹窗、输入搜索关键词、提交搜索请求,以及从搜索结果中准确识别并点击目标链接。文章通过一个完整的代码示例,演示了如何利用不同的元素定位策略(如 ID、Name、Class Name、Tag Name)来有效与网页元素交互,并提供了关键步骤的解析与注意事项,旨在帮助开发者掌握自动化网页导航的核心技能。

引言

在使用 Java Selenium 进行网页自动化测试或数据抓取时,经常会遇到需要与动态网页元素交互的场景,例如在搜索引擎中输入关键词并点击搜索结果。本文将专注于解决一个常见问题:如何在使用 Java Selenium 成功执行 Google 搜索后,准确地点击搜索结果列表中的特定链接。我们将通过一个具体的案例,详细讲解实现这一目标的步骤和技巧。

环境准备

在开始之前,请确保您的开发环境中已配置好以下组件:

  1. Java Development Kit (JDK):版本 8 或更高。
  2. Maven 或 Gradle:用于项目管理和依赖引入。
  3. Selenium WebDriver 库:在 pom.xml (Maven) 或 build.gradle (Gradle) 中添加 Selenium 依赖。
  4. ChromeDriver:与您安装的 Chrome 浏览器版本兼容的 ChromeDriver 可执行文件。您可以从 ChromeDriver 官方网站 下载。为了简化驱动管理,强烈推荐使用 WebDriverManager 库,它能自动下载并配置所需的浏览器驱动。

Maven 依赖示例:

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


    
    
        org.seleniumhq.selenium
        selenium-java
        4.1.2 
    
    
    
        io.github.bonigarcia
        webdrivermanager
        5.3.0 
    

核心步骤解析

我们将通过以下步骤实现 Google 搜索结果的点击:

1. 初始化 WebDriver

首先,需要初始化 WebDriver 实例,这里我们使用 ChromeDriver。如果使用 WebDriverManager,则无需手动设置 webdriver.chrome.driver 系统属性。

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager; // 如果使用 WebDriverManager

// ...
public static void main(String[] args) {
    // 使用 WebDriverManager 自动设置 ChromeDriver
    WebDriverManager.chromedriver().setup();
    // 或者手动设置 ChromeDriver 路径
    // System.setProperty("webdriver.chrome.driver", "path/to/your/chromedriver.exe");

    WebDriver driver = new ChromeDriver();
    driver.manage().window().maximize(); // 最大化浏览器窗口以确保元素可见
    // ...
}

2. 导航至 Google 并处理 Cookie 同意弹窗

许多网站(包括 Google)在首次访问时会显示 Cookie 同意弹窗。在进行后续操作前,必须处理这些弹窗。

driver.get("https://www.google.cz"); // 导航到 Google 网站

// 尝试接受 Cookie 弹窗。注意:Google 的 Cookie 弹窗元素 ID 或结构可能随时间变化。
// L2AGLb 是一个常见的同意按钮 ID
List acceptBtns = driver.findElements(By.id("L2AGLb"));
if (!acceptBtns.isEmpty() && acceptBtns.get(0).isDisplayed()) {
    acceptBtns.get(0).click();
} else {
    // 如果没有找到特定 ID 的按钮,可以尝试查找包含 "Accept all" 或 "我同意" 文本的按钮
    List potentialAcceptButtons = driver.findElements(By.xpath("//button[contains(.,'Accept all') or contains(.,'我同意')]"));
    if (!potentialAcceptButtons.isEmpty() && potentialAcceptButtons.get(0).isDisplayed()) {
        potentialAcceptButtons.get(0).click();
    }
}

注意事项: Cookie 同意弹窗的元素定位器(ID、XPath 等)可能会随着网站更新而改变。在实际应用中,您可能需要根据最新的网页结构进行调整。

3. 输入搜索关键词

定位到 Google 搜索框,并使用 sendKeys() 方法输入搜索关键词。

WebElement searchInput = driver.findElement(By.name("q")); // 'q' 是 Google 搜索框的 name 属性
searchInput.sendKeys(mySearchString); // mySearchString 是您要搜索的字符串

4. 提交搜索请求

Google 搜索页面通常有多个同名的提交按钮。我们需要找到并点击可见的那个。

List searchBtns = driver.findElements(By.name("btnK")); // 'btnK' 是 Google 搜索按钮的 name 属性
for (WebElement searchBtn : searchBtns) {
    // 通过判断元素位置和可见性来确定正确的搜索按钮
    Point p = searchBtn.getLocation();
    if (p.getX() > 0 && p.getY() > 0 && searchBtn.isDisplayed()) {
        searchBtn.click();
        break;
    }
}

这里使用 getLocation() 检查元素在页面上的坐标,结合 isDisplayed() 确保元素可见,从而排除隐藏的或不在视口内的同名按钮。

5. 定位并点击搜索结果

搜索结果通常包含在一个特定的 HTML 结构中。我们需要识别这些结构,然后从中提取出实际的链接元素。

MCP Market
MCP Market

MCP Servers集合平台,帮你找到最好的MCP服务器

下载
List resultLinks = new ArrayList<>();
// 定位所有包含搜索结果的 div 元素
// 'yuRUbf' 是 Google 搜索结果条目常用的 class name
List searchResultDivs = driver.findElements(By.className("yuRUbf"));

if (!searchResultDivs.isEmpty()) {
    for (WebElement searchResultDiv : searchResultDivs) {
        // 在每个结果 div 中找到第一个  标签,即实际的链接
        resultLinks.add(searchResultDiv.findElement(By.tagName("a")));
    }

    // 点击第一个搜索结果链接
    if (!resultLinks.isEmpty()) {
        resultLinks.get(0).click(); // 点击列表中的第一个链接

        // 页面已切换,打印当前 URL 和标题进行验证
        System.out.println("Current URL: " + driver.getCurrentUrl());
        System.out.println("Current title: " + driver.getTitle());
    } else {
        System.out.println("未找到任何搜索结果链接。");
    }
} else {
    System.out.println("未找到任何搜索结果容器。");
}

这里利用 By.className("yuRUbf") 找到每个搜索结果的容器,然后使用 findElement(By.tagName("a")) 在该容器内部进一步定位到实际的超链接。这种组合定位方式比直接使用复杂的 XPath 更具鲁棒性。

6. 关闭浏览器

完成所有操作后,务必关闭浏览器实例以释放资源。

driver.quit();

完整示例代码

下面是整合上述所有步骤的完整 Java Selenium 代码示例:

package com.example.selenium;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit; // 用于隐式等待,可选

public class GoogleSearchClickTutorial {

    public static void main(String[] args) {
        // 1. 初始化 WebDriver
        WebDriverManager.chromedriver().setup(); // 自动下载并配置 ChromeDriver
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize(); // 最大化浏览器窗口
        // driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // 设置隐式等待,可选

        List resultLinks = new ArrayList<>();
        String mySearchString = "fantomas wiki"; // 定义搜索关键词

        try {
            // 2. 导航至 Google 并处理 Cookie 同意弹窗
            driver.get("https://www.google.cz");

            // 尝试接受 Cookie 弹窗
            // 注意:Google 的 Cookie 弹窗元素 ID 或结构可能随时间变化
            List acceptBtns = driver.findElements(By.id("L2AGLb"));
            if (!acceptBtns.isEmpty() && acceptBtns.get(0).isDisplayed()) {
                System.out.println("找到并点击了 Cookie 同意按钮。");
                acceptBtns.get(0).click();
            } else {
                // 备用方案:查找包含特定文本的按钮
                List potentialAcceptButtons = driver.findElements(By.xpath("//button[contains(.,'Accept all') or contains(.,'我同意') or contains(.,'全部接受')]"));
                if (!potentialAcceptButtons.isEmpty() && potentialAcceptButtons.get(0).isDisplayed()) {
                    System.out.println("找到并点击了备用 Cookie 同意按钮。");
                    potentialAcceptButtons.get(0).click();
                } else {
                    System.out.println("未找到 Cookie 同意按钮或其不可见,尝试继续。");
                }
            }

            // 3. 输入搜索关键词
            WebElement searchInput = driver.findElement(By.name("q"));
            searchInput.sendKeys(mySearchString);
            System.out.println("已输入搜索关键词: " + mySearchString);

            // 4. 提交搜索请求
            List searchBtns = driver.findElements(By.name("btnK"));
            boolean clickedSearchButton = false;
            for (WebElement searchBtn : searchBtns) {
                Point p = searchBtn.getLocation();
                if (p.getX() > 0 && p.getY() > 0 && searchBtn.isDisplayed()) {
                    searchBtn.click();
                    clickedSearchButton = true;
                    System.out.println("已点击搜索按钮。");
                    break;
                }
            }
            if (!clickedSearchButton) {
                System.out.println("未找到可见的搜索按钮。");
            }

            // 5. 定位并点击搜索结果
            // 等待搜索结果加载,这里可以考虑使用显式等待
            // new WebDriverWait(driver, Duration.ofSeconds(10)).until(ExpectedConditions.visibilityOfElementLocated(By.className("yuRUbf")));

            List searchResultDivs = driver.findElements(By.className("yuRUbf"));
            if (!searchResultDivs.isEmpty()) {
                System.out.println("找到 " + searchResultDivs.size() + " 个搜索结果容器。");
                for (WebElement searchResultDiv : searchResultDivs) {
                    // 获取 div 中的第一个  标签
                    resultLinks.add(searchResultDiv.findElement(By.tagName("a")));
                }

                // 点击第一个搜索结果链接
                if (!resultLinks.isEmpty()) {
                    resultLinks.get(0).click();
                    System.out.println("已点击第一个搜索结果链接。");

                    // 页面已切换,打印当前 URL 和标题进行验证
                    System.out.println("当前 URL: " + driver.getCurrentUrl());
                    System.out.println("当前标题: " + driver.getTitle());
                } else {
                    System.out.println("未找到任何搜索结果链接。");
                }
            } else {
                System.out.println("未找到任何搜索结果容器。");
            }

        } catch (Exception e) {
            System.err.println("发生错误: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 6. 关闭浏览器
            if (driver != null) {
                driver.quit();
                System.out.println("浏览器已关闭。");
            }
        }
    }
}

示例输出:

Starting ChromeDriver 107.0.5304.62 (1eec40d3a5764881c92085aaee66d25075c159aa-refs/branch-heads/5304@{#942}) on port 20110
Only local connections are allowed.
Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.
ChromeDriver was started successfully.
Lis 29, 2022 11:10:07 DOP. org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C
找到并点击了 Cookie 同意按钮。
已输入搜索关键词: fantomas wiki
已点击搜索按钮。
找到 10 个搜索结果容器。
已点击第一个搜索结果链接。
当前 URL: https://cs.wikipedia.org/wiki/Fantomas
当前标题: Fantomas – Wikipedie
浏览器已关闭。

(注:实际输出中的日期和 ChromeDriver 版本信息可能因您的环境和时间而异。)

注意事项与总结

  1. 元素定位策略选择: 优先使用 ID、Name、Class Name 进行定位,它们通常比 XPath 更稳定高效。当这些定位器不可用时,再考虑使用 CSS Selector 或 XPath。避免使用过于复杂的 XPath,因为它们对页面结构变化非常敏感。

  2. 动态元素和等待机制: 网页元素加载是异步的,尤其在处理弹窗或 AJAX 请求时。本示例中虽然没有显式使用等待,但在实际项目中,强烈建议使用 WebDriverWait 结合 ExpectedConditions 来等待元素出现或可点击,以提高脚本的稳定性。例如:

    import org.openqa.selenium.support.ui.WebDriverWait;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import java.time.Duration; // Java 8+
    
    // ...
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someId")));
    element.click();
  3. 页面结构变化: Google 等大型网站的 UI 结构可能会频繁更新。这意味着您编写的定位器(如 By.id("L2AGLb") 或 By.className("yuRUbf"))可能在未来某个时间点失效。定期检查并更新定位器是维护自动化脚本的必要工作。

  4. 错误处理: 在自动化脚本中加入 try-catch-finally 块是一个好习惯,可以捕获潜在的 NoSuchElementException 或其他运行时错误,并确保在脚本执行完毕(无论成功与否)都能正确关闭浏览器。

  5. 浏览器最大化: driver.manage().window().maximize() 有助于确保所有元素都在可视区域内,减少因元素不在视口内而导致的点击失败问题。

通过本文的详细教程和示例代码,您应该已经掌握了使用 Java Selenium 自动化 Google 搜索并点击搜索结果的关键技术。理解并灵活运用各种元素定位策略,结合适当的等待机制和错误处理,将使您的自动化脚本更加健壮和可靠。

相关专题

更多
java
java

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

842

2023.06.15

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

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

742

2023.07.05

java自学难吗
java自学难吗

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

739

2023.07.31

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

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

397

2023.08.01

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

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

399

2023.08.02

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

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

446

2023.08.02

java有什么用
java有什么用

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

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16926

2023.08.03

Golang 性能分析与pprof调优实战
Golang 性能分析与pprof调优实战

本专题系统讲解 Golang 应用的性能分析与调优方法,重点覆盖 pprof 的使用方式,包括 CPU、内存、阻塞与 goroutine 分析,火焰图解读,常见性能瓶颈定位思路,以及在真实项目中进行针对性优化的实践技巧。通过案例讲解,帮助开发者掌握 用数据驱动的方式持续提升 Go 程序性能与稳定性。

1

2026.01.22

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

CSS教程
CSS教程

共754课时 | 22.1万人学习

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

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