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
相关产品推荐
相关产品推荐

