如何在Python的Selenium中逐个点击搜索结果中抓取到的所有链接?
解决方案
你可以通过两种方式实现同一浏览器中逐个打开搜索结果链接并支持标签页切换:
方法一:使用键盘快捷键打开新标签
借助Keys类模拟Ctrl+点击(Windows/Linux)或Command+点击(Mac),让链接在新标签页打开:
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys serv_obj = Service("F:\Softwares\Selenium WebDrivers\chromedriver.exe") driver = webdriver.Chrome(service=serv_obj) driver.maximize_window() driver.implicitly_wait(5) url = "https://testautomationpractice.blogspot.com/" driver.get(url) # 执行搜索 driver.find_element(By.XPATH, "//input[@id='Wikipedia1_wikipedia-search-input']").send_keys("selenium") driver.find_element(By.XPATH, "//input[@type='submit']").click() # 获取搜索结果链接元素 search_result = driver.find_elements(By.XPATH, "//div[@id='wikipedia-search-result-link']/a") # 逐个点击链接,打开新标签 for item in search_result: # Windows/Linux用Keys.CONTROL,Mac用Keys.COMMAND item.send_keys(Keys.CONTROL + Keys.ENTER) time.sleep(1) # 等待标签页加载 # 切换标签页示例:遍历所有窗口句柄 window_handles = driver.window_handles for handle in window_handles: driver.switch_to.window(handle) print("当前标签页标题:", driver.title) time.sleep(1) # 最后切回原标签页 driver.switch_to.window(window_handles[0])
方法二:通过JavaScript打开新标签页
直接调用JavaScript打开链接,这种方式无需依赖元素定位的稳定性,适合已获取href列表的场景:
import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By serv_obj = Service("F:\Softwares\Selenium WebDrivers\chromedriver.exe") driver = webdriver.Chrome(service=serv_obj) driver.maximize_window() driver.implicitly_wait(5) url = "https://testautomationpractice.blogspot.com/" driver.get(url) # 执行搜索 driver.find_element(By.XPATH, "//input[@id='Wikipedia1_wikipedia-search-input']").send_keys("selenium") driver.find_element(By.XPATH, "//input[@type='submit']").click() # 获取所有链接的href search_result = driver.find_elements(By.XPATH, "//div[@id='wikipedia-search-result-link']/a") links = [item.get_attribute("href") for item in search_result] # 逐个打开链接 for link in links: driver.execute_script(f"window.open('{link}');") time.sleep(1) # 切换标签页示例 window_handles = driver.window_handles for idx, handle in enumerate(window_handles): driver.switch_to.window(handle) print(f"第{idx+1}个标签页URL:", driver.current_url) time.sleep(1) # 关闭所有新标签页,保留原页面 for handle in window_handles[1:]: driver.switch_to.window(handle) driver.close() driver.switch_to.window(window_handles[0])
关键说明
driver.window_handles会返回当前浏览器所有窗口句柄的列表,第一个元素是初始标签页的句柄。- 使用
driver.switch_to.window(handle)可以切换到指定标签页。 - 添加
time.sleep()是为了等待页面加载完成,实际项目中建议使用显式等待(WebDriverWait)替代固定等待时间。
内容的提问来源于stack exchange,提问作者Tanvir Ahmed
相关产品推荐
相关产品推荐

