先交代下背景。我从2018年就开始用Selenium了,当时项目是个老旧的金融后台,只能跑IE。那时候Selenium真的是唯一解,其他框架连IE都驱动不了。说真的,不是吹,webdriver协议被Selenium带成了事实标准,到现在很多云测平台还在用它。但你要让我在2025年新项目里选框架,我大概率选Playwright,这事得从一次凌晨三点调试的经历讲起。
花了三个小时排查一个偶发报错,最后定位到是Selenium的隐式等待和显式等待混用导致的。那代码是同事留下的,全局设置了implicitly_wait(10),然后有些地方又用WebDriverWait超时5秒,两种机制在底层是独立轮询的,加在一起会翻倍甚至随机失效。具体场景是:元素在DOM里存在但不可用,Selenium会等到超时,然后抛ElementClickInterceptedException。更诡异的是本地跑没问题,CI上偶现。后来我把所有WebDriverWait里的poll_frequency设为0.5,并统一去掉全局隐式等待,才算稳。但你能想象这种问题有多耗命?
最近两个月我把一个内部平台从Selenium迁移到了Playwright,不是因为Selenium不能用,而是启动速度差太多了。我这边用Chrome headless跑500条用例,Selenium需要先启动chromedriver(大约1.2秒),再初始化一个全新的浏览器实例(平均2.8秒),加上用户目录的加载,单任务光启动就占了4秒。Playwright虽然也是开新实例,但它用的是编译好的Chromium,启动到可执行状态只要600毫秒左右,而且默认复用浏览器内核,500条用例整体时间从48分钟降到了26分钟,这个数字很直观。另外Selenium的driver需要手动去下载匹配版本,一不小心chromedriver和Chrome版本对不上就报SessionNotCreatedException,我用docker做镜像时被这个问题卡过好几回。
但你说让我彻底抛弃Selenium?也不至于。有个做农业贷款的老客户,他们的核心系统只能跑在IE11的文档模式上,Selenium配合IEDriverServer 3.150.1是唯一能跑通的方案。Playwright明确不支持IE,Cypress更是压根不搭。所以我觉得选型这事不能只看技术趋势,得看你的用户环境是不是还吊在旧世界。Selenium的另一把杀手锏是Grid,我搭过一个四台机器的Grid 4,支持concurrent并行分发,一个用例分四份跑,虽然配置麻烦,但稳定性一流。而Playwright自带的pytest-xdist分布式要么靠局域网共享,要么用第三方组件,没Grid那么成熟。
顺手分享一个解决StaleElementReferenceException的骚操作。我之前一直用try-except重试,后来发现问题的根源是DOM元素被替换了,你手里的引用已经失效。正确姿势是重新定位元素,但很多脚本里的定位器本身写得太脆,比如用了绝对路径的XPath。我给团队定了个规约:所有元素要么用data-testid属性,要么用相对XPath,并且设置页面加载完成后等待2秒再操作。如果你还是遇到,写个简单的重试装饰器,每次异常后sleep(0.3)再重新driver.find_element,最多三次。这方法成功率到99.2%,别嫌糙,管用。
另外网上很多人没提过,Selenium还有一个反爬标志:执行execute_script('return navigator.webdriver')会返回true。我做过一个数据采集项目,目标网站识别这个特征直接封IP。后来也没用什么高大上的掩码,就在启动参数里加了--disable-blink-features=AutomationControlled,并执行一段CDP脚本删掉webdriver这个属性。核心代码就三行:options.add_experimental_option("excludeSwitches", ["enable-automation"]),然后启动后执行driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"})。这个操作在Selenium 4.0以上版本才有用,我个人建议别用来搞坏事,但应付那些无脑校验还是够的。
最后说点大实话。Selenium的文档和社区资源比Playwright多一百倍,你遇到任何问题都能搜到答案,Playwright的官方文档也写得好,但中文社区的人还不多。我自己的判断是:如果你要做跨平台的GUI测试,且团队对Python-Selenium很熟,完全没有必要折腾。如果你跟我一样受了偶发等待的折磨,又需要高并发跑用例,建议抽出一个月试试Playwright,它的tracing追踪真的能让你看到每一步的DOM快照,而不是只给一串日志。框架本身没有优劣,只有匹配不匹配。以上都是我的具体体验,参数也给你了,自己不信就跑一遍测测。