笔者这两天在做一个自动化方案,用来优化数据统计。其中一部分数据需要通过云上堡垒机跳转访问,而这个堡垒机在笔者日常使用的火狐浏览器上运行不是很正常(表现在有些复制粘贴按钮显示不太灵敏)。
但在Edge浏览器上基本正常,因此笔者自动化也准备通过Selenium访问Edge浏览器来实现。
然而问题来了,笔者在进行Selenium打开Edge浏览器测试时,发现网页刚被打开后,就闪退了!而终端窗口还会提示
“DevTools listening on ws://127.0.0.1:59791/devtools/browser/78d01a4b-6a19-40ba-8736-b1bca66d5952
[27628:15544:0914/095450.252:ERROR:edge_qqbrowser_importer_utils_win.cc(155)] QQBrowser user data path not found.”
的错误,如下图:
笔者一度以为这是的的确确的闪退,因为既有报错信息,又有闪退行为。
然后一番试验、上网查询、研究,快两天过后,今天终于在恍然间将这个问题算是彻底征服。
节省读者时间,先放解决措施:
这个“闪退”是正常的!而且实质上并非真的闪退,而是Selenium Webdriver的正常行为。
接下来做一个简明的解释,相信遇到过同样疑问的朋友很快就会明白了:
1、Selenium Webdriver对于不同浏览器的行为会有些许差异。而打开网址后的默认行为就是差异之一。
例如使用下面这段大家基本都会默认使用的调用代码:
from selenium import webdriver
#driver = webdriver.Edge()
#driver = webdriver.Chrome()
driver = webdriver.Firefox()
driver.get("https://www.baidu.com")
经笔者测试,Firefox会停留在当前页面,默认不会自动关闭浏览器;而Chrome和Edge均会自动关闭浏览器。
就是这个小小的差异,而对于笔者这个日常将火狐浏览器作为默认浏览器,并只在火狐浏览器做了大量自动化工作的人来说,对于浏览器的默认行为潜移默化认可了,误以为Chrome和Edge的自动关闭是“闪退”。。。
因此,如果非要Chrome和Edge不自动关闭,加个延时等待就可以了。
例如:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
chrome_options = Options()
chrome_options.add_argument('--incognito') # 添加无痕模式的参数
executable_path="C:\chromedriver-win64",
driver = webdriver.Chrome( options=chrome_options)
driver.get("https://www.baidu.com")
time.sleep(60)
#driver = webdriver.Edge()
#driver.get("https://www.baidu.com")
2、“DevTools listening on ws://127.0.0.1:59791/devtools/browser/”也的确不算是错误信息,笔者认为更准确是告警提示,这个用搜索的智能回答来解释吧,笔者认为回答得挺好,回答如下图:
至此,疑惑及问题彻底解决,笔者内心总算舒坦了:)
恍然醒悟之前,其实笔者也去核对了浏览器版本、也去Chrome和Edge开发者官网下载了对应版本的msedgedriver.exe和chromedriver.exe并将其保存路径加入了系统Path环境变量。同时也检查了Python版本、Selenium版本。这些工作对于因为版本不一致可能引起的真“闪退”应该也是有效果的。
到此,完毕,希望帮助到遇到同样问题或疑惑的朋友们;)