Selenium中使用window.open('_blank')能否追踪打开的标签页?
如何追踪Selenium中通过execute_script打开的标签页
当然可以实现!我之前批量开标签页时也踩过手动追踪的坑,下面几个方法亲测靠谱,帮你精准定位每个新打开的标签页:
方法1:通过窗口句柄的变化追踪
这是最直接的方式——打开新标签页前后,driver.window_handles的列表会新增一个元素,我们只需要对比前后的列表,就能拿到新标签页的句柄:
# 先记录当前所有窗口的句柄 original_handles = driver.window_handles # 执行打开新标签页的JS代码 driver.execute_script("window.open('{0}', '_blank');".format(player_url)) # 找出新增的那个句柄(如果批量操作建议加等待,避免页面加载慢导致的遗漏) new_handle = [handle for handle in driver.window_handles if handle not in original_handles][0] # 可以把URL和句柄存进字典,方便后续调用 tab_map = {player_url: new_handle}
如果担心页面加载慢导致句柄没及时更新,推荐配合显式等待使用,确保窗口数量确实增加了:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC original_handles = driver.window_handles driver.execute_script("window.open('{0}', '_blank');".format(player_url)) # 等待窗口数量比原来多1个,超时时间10秒 WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(len(original_handles) + 1)) new_handle = [h for h in driver.window_handles if h not in original_handles][0]
方法2:给新窗口绑定自定义标识
如果窗口顺序可能被打乱(比如用户手动切换了标签页),可以在打开新窗口时给它加个自定义属性,后续通过遍历句柄匹配这个属性来定位:
# 打开新窗口时,给它绑定对应的URL作为自定义属性 driver.execute_script(f"var newWin = window.open('{player_url}', '_blank'); newWin.target_url = '{player_url}';") # 遍历所有窗口句柄,找到匹配的标签页 target_handle = None for handle in driver.window_handles: driver.switch_to.window(handle) # 获取自定义属性的值 current_target = driver.execute_script("return window.target_url;") if current_target == player_url: target_handle = handle break # 记得切回原来的窗口(如果需要的话) driver.switch_to.window(original_handles[0])
这个方法的优势是即使窗口顺序变化,也能精准找到对应URL的标签页,适合批量操作且窗口较多的场景。
方法3:让JS直接返回新窗口关联信息
execute_script可以返回JS执行的结果,我们可以让window.open返回的窗口对象带上我们需要的标识,不过需要注意Selenium对JS返回对象的处理:
# 执行JS并返回新窗口的自定义标识 new_window_info = driver.execute_script(f""" var newWin = window.open('{player_url}', '_blank'); return {{url: '{player_url}', handle: newWin.window.name}}; """) # 后续可以通过window.name来匹配句柄 for handle in driver.window_handles: driver.switch_to.window(handle) if driver.execute_script("return window.name;") == new_window_info['handle']: # 找到对应的标签页 break
注意事项
- 批量操作时建议维护一个
URL: 句柄的字典,方便快速切换和管理标签页; - 确保浏览器允许弹出新窗口,否则
window.open可能会被拦截; - 切换窗口后如果需要回到原窗口,记得保存原窗口的句柄,用完切回去。
内容的提问来源于stack exchange,提问作者Blaszard
相关产品推荐
相关产品推荐

