如何用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>Human Capital Management>Payroll>Employee Maintenance>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
相关产品推荐
相关产品推荐

