You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Selenium与C#中使用点击事件并获取跳转后的新页面?

在Selenium C#中处理点击事件与新页面跳转的解决方案

咱们来一步步解决你提到的谷歌搜索场景,包括点击操作的实现,以及跳转后页面的获取问题,尽量用更稳定的写法替代硬等待。

一、完整场景实现代码

先直接上可运行的完整代码,包含打开谷歌、搜索、点击跳转、获取新页面的逻辑:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using System;

public class GoogleSearchDemo
{
    public void RunGoogleSearch()
    {
        // 配置Chrome选项,无头模式可选
        ChromeOptions options = new ChromeOptions();
        options.AddArgument("--headless=new"); // 新版无头模式,更贴近正常浏览器行为
        
        // 使用using自动释放driver资源
        using (IWebDriver driver = new ChromeDriver(options))
        {
            // 初始化显式等待,替代Thread.Sleep(),更稳定
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
            
            // 打开谷歌印度主页
            driver.Navigate().GoToUrl("https://www.google.co.in/");
            
            // 等待搜索框加载完成并输入"Test"
            IWebElement searchBox = wait.Until(d => d.FindElement(By.Name("q")));
            searchBox.SendKeys("Test");
            
            // 点击搜索按钮(也可以用Enter键,避免按钮加载慢的问题)
            // 方式1:点击搜索按钮
            IWebElement searchBtn = wait.Until(d => d.FindElement(By.Name("btnK")));
            searchBtn.Click();
            
            // 方式2:按Enter键(更可靠,适合按钮隐藏或加载延迟的情况)
            // searchBox.SendKeys(Keys.Enter);
            
            // ---------------------- 重点:处理页面跳转 ----------------------
            // 情况1:点击后在原窗口跳转(谷歌搜索默认是这种)
            // 等待搜索结果页面加载完成,比如等待搜索结果容器出现
            wait.Until(d => d.FindElement(By.Id("search")));
            Console.WriteLine($"跳转后页面标题:{driver.Title}");
            
            // 情况2:如果点击后打开新窗口/标签页(比如某些场景)
            // 获取所有窗口句柄,切换到最新打开的窗口
            // var allWindows = driver.WindowHandles;
            // driver.SwitchTo().Window(allWindows[allWindows.Count - 1]);
            // wait.Until(d => d.Title.Contains("Test"));
            // Console.WriteLine($"新窗口页面标题:{driver.Title}");
        }
    }
}

二、核心知识点拆解

  • 替代硬等待:别用Thread.Sleep(),改用WebDriverWait显式等待,它会在目标元素出现时立即执行,既提升效率又避免因网络波动导致的失败。
  • 点击操作的两种思路:
    • 直接定位按钮点击:适合按钮明确可见的场景
    • 按Enter键提交:适合按钮加载慢、被遮挡,或者元素定位困难的场景,稳定性更高
  • 页面跳转的两种处理方式:
    1. 原窗口跳转:不需要额外操作,直接用当前driver继续操作,等待新页面的标志性元素加载完成即可
    2. 新窗口/标签页跳转:通过driver.WindowHandles获取所有窗口的句柄,切换到最后一个(最新打开的)窗口,之后就能操作新页面了

三、常见问题排查

  • 点击后没反应?检查元素定位是否正确,或者元素是否被弹窗、广告遮挡,可以用Actions类模拟真实点击:
    Actions actions = new Actions(driver);
    actions.MoveToElement(searchBtn).Click().Perform();
    
  • 切换窗口后找不到元素?确认已经切换到正确的窗口句柄,并且用显式等待等待目标元素加载完成,别直接操作。

内容的提问来源于stack exchange,提问作者Sumit Garg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:45:24