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

Selenium循环点击链接时无法在新标签页打开文件求助

问题描述

遍历表格时,当**'Exhibit Type'列的值为ID Label/Location Info或Users Manual时,需要在新标签页打开'View Attachment'**列中的文件。首次点击能成功在新标签页打开,但切回父标签页打开下一个文件时,文件会在之前的标签页打开而非新建标签页。

表格截图:
表格数据截图

原代码如下:

# Imports
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Function to open the link file in a new tab
def explicit_wait_xpath(my_selector):
    wait = WebDriverWait(driver, 30)
    element = wait.until(EC.element_to_be_clickable((By.XPATH,my_selector)))
    element.click()

if __name__ == '__main__':
    driver = webdriver.Chrome()

    # Open the link in Google Chrome and maximise the window
    driver.get("https://apps.fcc.gov/oetcf/eas/reports/ViewExhibitReport.cfm?mode=Exhibits&RequestTimeout=500&calledFromFrame=Y&application_id=UsAM7eH4uXO%2BeOEaTsEbFA%3D%3D&fcc_id=2AKW5-RH570")
    driver.maximize_window()
    parent_handle = driver.current_window_handle

    # Variables for filtering table data
    ID_LABEL = 'ID Label/Location Info'
    USERS_MANUAL = 'Users Manual'

    # Count the number of rows in the table
    rows = len(driver.find_elements(by=By.XPATH, value="//table[@id='rsTable']/tbody[@id='offTblBdy']/tr"))

    # Loop through table to find correct document to open in a new tab based on the exhibit type
    for i in range(1,rows+1):
        row = driver.find_element(by=By.XPATH,value=f'//table[@id="rsTable"]/tbody[@id="offTblBdy"]/tr[{i}]').text
        exhibit_type = driver.find_element(by=By.XPATH,value=f'//table[@id="rsTable"]/tbody[@id="offTblBdy"]/tr[{i}]/td[3]').text

        # If the Exhibit Type column is 'ID Label/Location Info' or 'Users Manual', open the link to the file in a new tab
        if exhibit_type == ID_LABEL or exhibit_type == USERS_MANUAL:
            print(row)
            url = f'//table[@id="rsTable"]/tbody[@id="offTblBdy"]/tr[{i}]/td[2]/a'

            explicit_wait_xpath(url)

            driver.switch_to.window(parent_handle)

尝试过用driver.get()直接访问文件URL,但网站限制只能从站内链接打开内部文档,怀疑是循环导致无法新建标签页。

解决方案

问题根源是浏览器默认会复用同源且未修改的标签页加载新链接。要强制每次新建标签页,有两种可靠实现方式:

方式一:模拟键盘组合键点击

通过Ctrl+Click(Windows/Linux)或Command+Click(Mac)的操作,强制浏览器在新标签页打开链接。修改后的代码如下:

# Imports
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

# Function to open the link file in a new tab
def open_link_in_new_tab(my_selector):
    wait = WebDriverWait(driver, 30)
    element = wait.until(EC.element_to_be_clickable((By.XPATH, my_selector)))
    
    # 模拟Ctrl+点击(Windows/Linux),Mac环境替换为Keys.COMMAND
    ActionChains(driver) \
        .key_down(Keys.CONTROL) \
        .click(element) \
        .key_up(Keys.CONTROL) \
        .perform()

if __name__ == '__main__':
    driver = webdriver.Chrome()

    driver.get("https://apps.fcc.gov/oetcf/eas/reports/ViewExhibitReport.cfm?mode=Exhibits&RequestTimeout=500&calledFromFrame=Y&application_id=UsAM7eH4uXO%2BeOEaTsEbFA%3D%3D&fcc_id=2AKW5-RH570")
    driver.maximize_window()
    parent_handle = driver.current_window_handle

    ID_LABEL = 'ID Label/Location Info'
    USERS_MANUAL = 'Users Manual'

    rows = len(driver.find_elements(by=By.XPATH, value="//table[@id='rsTable']/tbody[@id='offTblBdy']/tr"))

    for i in range(1, rows + 1):
        exhibit_type = driver.find_element(by=By.XPATH, value=f'//table[@id="rsTable"]/tbody[@id="offTblBdy"]/tr[{i}]/td[3]').text

        if exhibit_type == ID_LABEL or exhibit_type == USERS_MANUAL:
            row = driver.find_element(by=By.XPATH, value=f'//table[@id="rsTable"]/tbody[@id="offTblBdy"]/tr[{i}]').text
            print(row)
            url = f'//table[@id="rsTable"]/tbody[@id="offTblBdy"]/tr[{i}]/td[2]/a'

            open_link_in_new_tab(url)
            driver.switch_to.window(parent_handle)

方式二:通过JavaScript打开新标签页

获取链接的href属性后,用JS强制打开新标签页,兼容性更好,无需依赖键盘按键:

# 修改open_link_in_new_tab函数即可
def open_link_in_new_tab(my_selector):
    wait = WebDriverWait(driver, 30)
    element = wait.until(EC.element_to_be_clickable((By.XPATH, my_selector)))
    link_url = element.get_attribute('href')
    # 用JS打开新标签页
    driver.execute_script(f"window.open('{link_url}');")

两种方式都能确保每次符合条件的链接都在全新标签页打开,不会复用之前的标签页。

内容的提问来源于stack exchange,提问作者dan.c

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:47:49