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

如何用Python Selenium阻止非链接Web元素在新标签页打开

Python Selenium 点击非锚点元素时强制在当前窗口打开页面

问题场景

需要点击一个无锚点、无href属性的Web元素,要求新页面在当前窗口打开,而非新标签页。目标元素HTML结构如下:

<div class="prevent-select">
    <div></div>
    <span class="tyl-list-item__text menuTitleClass" tabindex="0" data-testid="hub__tylermenu__node__title" text="Employee Job/Salary" aria-describedby="tcw-tooltip-56">Employee Job/Salary</span>
    <tcw-tooltip id="tcw-tooltip-56" style="border: 0px; clip: rect(0px, 0px, 0px, 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0px; position: absolute; width: 1px; outline: 0px; appearance: none;">Enterprise ERP&gt;Human Capital Management&gt;Payroll&gt;Employee Maintenance&gt;Employee Job/Salary</tcw-tooltip>
</div>

初始点击代码会触发新标签页打开:

url_jobSalary = WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Employee Job/Salary')]"))).click()

已尝试但无效的方法

方法1:尝试获取href属性直接跳转

目标元素无href属性,get_jobSalary返回空值,无法跳转:

url_jobSalary = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Employee Job/Salary')]")))
get_jobSalary = url_jobSalary.get_attribute('href')
browser.get(get_jobSalary)

方法2:通过JS设置target="_self"

设置后点击仍在新标签页打开:

url_jobSalary = WebDriverWait(browser, 30).until(EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Employee Job/Salary')]")))
browser.execute_script("arguments[0].target='_self';", url_jobSalary)
url_jobSalary.click()

方法3:修改Chrome配置选项

添加--profile-directory=Default参数后问题依旧:

options = Options()
options.add_argument('--profile-directory=Default')
options.add_experimental_option("prefs", {
    "download.default_directory" : download_path
})
options.headless = False
browser = webdriver.Chrome(options=options)

可行解决方案(针对Angular/ng页面)

由于页面使用Angular相关指令,跳转逻辑大概率通过window.open实现,可通过注入JS重写该方法,强制在当前窗口打开页面:

# 注入JS拦截window.open,将新窗口跳转转为当前窗口跳转
browser.execute_script("""
    window.open = function(url) {
        window.location.href = url;
    };
""")

# 等待元素可点击后执行点击
url_jobSalary = WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Employee Job/Salary')]")))
url_jobSalary.click()

如果上述方法失效,可尝试在点击时直接拦截默认行为并触发跳转:

url_jobSalary = WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.XPATH, "//*[contains(text(), 'Employee Job/Salary')]")))
browser.execute_script("""
    const elem = arguments[0];
    elem.addEventListener('click', function(e) {
        e.preventDefault();
        // 重写window.open确保跳转在当前窗口
        window.open = function(url) {
            window.location.href = url;
        };
        // 触发原点击逻辑
        elem.click();
    }, { once: true });
    elem.click();
""", url_jobSalary)

原理说明

非锚点元素的跳转通常由前端框架的事件逻辑触发window.open打开新标签,重写该方法后,所有通过window.open发起的跳转都会被转为当前窗口的location.href跳转,从而实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:50:19