如何解决Python webbrowser模块注册自定义浏览器时首次打开多标签页的延迟问题
我之前也碰到过类似的情况!用webbrowser注册自定义Chrome系浏览器(比如Thorium)后,第一次打开多个标签页总是卡个好几秒,窗口出来了但第二个标签要等半天,折腾了一会儿终于找到几个可行的办法,分享给你:
一次性通过命令行传递所有URL(最有效)
其实Chrome系的浏览器(包括Thorium)都支持在启动命令里直接跟多个URL,这样启动时就会一次性打开所有标签,完全不会有延迟。我们可以不用webbrowser的open()多次调用,而是直接用subprocess模块调用浏览器可执行文件,把所有要打开的URL作为参数传进去。举个例子:
import subprocess # 替换成你本地Thorium浏览器的实际路径 thorium_path = "path/to/your/thorium_executable" # 把需要打开的URL都放在列表里 target_urls = [ "https://stackoverflow.com/questions/79404453/how-do-i-circumvent-the-delay-when-loading-a-browser-for-the-first-time-with-the/79404566#79404566", "https://stackoverflow.com" ] # 一次性启动浏览器并打开所有URL subprocess.Popen([thorium_path] + target_urls)这样浏览器启动时就会同时加载所有标签,完全不会有你之前遇到的延迟问题。
调整webbrowser.open的参数(适合想保留webbrowser模块的场景)
如果你还是想继续用webbrowser注册的实例,试试在调用open()时指定new=0——这个参数的作用是告诉浏览器“在现有窗口的新标签打开”(Chrome系浏览器基本都支持这个逻辑)。另外,第一次调用后不用等太久,立刻发起第二次请求,偶尔能缩短延迟:import webbrowser import time # 替换成你本地Thorium的实际路径 thorium_path = "path/to/your/thorium_executable" webbrowser.register('Thorium', None, webbrowser.Chrome(thorium_path)) Thorium = webbrowser.get('Thorium') # 第一次打开指定new=0,强制用新标签 Thorium.open("https://stackoverflow.com/questions/79404453/how-do-i-circumvent-the-delay-when-loading-a-browser-for-the-first-time-with-the/79404566#79404566", new=0) # 给浏览器进程一点点响应时间,不用等太久 time.sleep(0.5) Thorium.open("https://stackoverflow.com", new=0)这个方法不一定能100%消除延迟,但大概率能缩短等待时间,要是追求稳定还是优先用第一个方法。
说回为啥原来的写法会有延迟:当你第一次调用Thorium.open()时,webbrowser模块会启动Thorium的进程,然后它会等浏览器完全初始化完成(比如加载内置组件、扩展程序这些),才会发送第二个open()的请求,这中间的等待就是你看到的5-10秒。而一次性传多个URL的话,浏览器启动时就把所有URL加入了加载队列,自然就没了等待的环节。
备注:内容来源于stack exchange,提问作者blahahaaahahaa

