Protractor:使用browser.pause()后测试执行仍自动关闭浏览器
嘿,我完全懂这个困扰——明明调用了browser.pause(),测试跑完浏览器还是直接关掉,确实挺闹心的。咱们一步步来排查解决:
首先,先纠正代码里的一个小错误
你代码里用by.id("#id")是不对的!by.id()的参数只需要传入纯ID值,不需要带#前缀,带了反而会找不到元素,可能间接导致测试流程异常,让pause()没机会生效。比如应该写成element(by.id("your-real-id")),而不是element(by.id("#your-real-id"))。
核心问题:browser.pause()的执行时机不对
Protractor默认会在测试用例执行完成后自动关闭浏览器,如果你的browser.pause()放在了测试流程的最后,或者因为前面的异步操作没处理好,导致测试已经进入清理阶段才触发pause(),那浏览器自然会直接关掉。
解决方法很简单:把browser.pause()放在你真正需要暂停的业务节点,比如在sendKeys("9999")之后,确保它在测试流程中被触发,而不是等测试跑完才执行。修改后的代码示例:
describe('test room example', function() { it("test", function(){ browser.ignoreSynchronization = true; browser.get("your-actual-url"); // 修正by.id的参数,去掉# element(by.id("correct-id")).click(); var EC = protractor.ExpectedConditions; // 同样去掉# var cashboxnumber = EC.visibilityOf(element(by.id("cashbox-id"))); var beginningCash = EC.visibilityOf(element(by.id("beginning-cash-id"))); var btnSignOn = EC.visibilityOf(element(by.id("signon-btn-id"))); browser.wait(EC.and(cashboxnumber, beginningCash, btnSignOn), 155000); element(by.id("input-id")).sendKeys("9999"); // 把pause放在这里,确保在关键操作后立即触发 browser.pause(); }); });
如果还是不行,试试这些备选方案
用
browser.debugger()替代browser.pause()
启动测试时加上--debug参数,比如:protractor your-conf-file.js --debug然后在代码里需要暂停的位置加
browser.debugger(),这样会进入调试模式,浏览器会保持打开,你还能一步步调试代码。修改配置文件阻止浏览器自动关闭
在你的protractor.conf.js里添加onComplete钩子,让测试结束后浏览器一直保持打开(适合调试时用,需要手动关闭):exports.config = { // ...其他配置项 onComplete: function() { // 让浏览器一直休眠,不会自动关闭 browser.driver.sleep(Infinity); } };
最后再确认一下
确保你的测试没有因为元素找不到、超时等异常提前结束——如果测试中途报错,那browser.pause()根本没机会执行,浏览器也会直接关闭。所以先把by.id()的错误修正,再检查元素定位是否正确,这样测试流程才能正常走到pause()的位置。
内容的提问来源于stack exchange,提问作者Rajan

