JMeter中WDS退出浏览器报错:Session ID为空,如何解决?
问题描述
在JMeter线程的最后一个Selenium采样器中尝试退出浏览器时,持续触发以下错误:
INFO c.g.j.p.w.s.WebDriverSampler: WebDriver has been quit.
2024-02-01 22:53:24,989 ERROR c.g.j.p.w.s.WebDriverSampler: Session ID is null. Using WebDriver after calling quit()?
Build info: version: '4.10.0', revision: 'c14d967899'
先后尝试过WDS.browser.quit()和WDS.browser.close()两种关闭方式,问题仍未解决。相关代码片段如下:
var handles = WDS.browser.getWindowHandles().toArray(); WDS.browser.switchTo().window(handles[handles.length - 1]); java.lang.Thread.sleep(3000); WDS.browser.close(); WDS.log.info("(ACO Dashboard Visit 360 Map) Page load correctly."); } } else { WDS.log.info("The Trimmed text does not contain ' Visit 360'. Skipping click."); } } catch (err) { WDS.log.error("Error: " + err); } finally { WDS.browser.quit(); WDS.log.info("WebDriver has been quit."); }
问题原因
代码中先调用WDS.browser.close()关闭当前窗口,若该窗口是浏览器的最后一个窗口,WebDriver会话会被自动终止。此时在finally块中再次调用WDS.browser.quit(),就会因会话已不存在(Session ID为null)而触发错误。
解决方案
根据实际场景选择以下任意一种处理方式:
方案1:移除重复的quit()调用
如果WDS.browser.close()关闭的是最后一个窗口,会话会自动结束,无需额外调用quit()。修改代码移除finally块中的quit()逻辑:
var handles = WDS.browser.getWindowHandles().toArray(); WDS.browser.switchTo().window(handles[handles.length - 1]); java.lang.Thread.sleep(3000); WDS.browser.close(); WDS.log.info("(ACO Dashboard Visit 360 Map) Page load correctly."); } } else { WDS.log.info("The Trimmed text does not contain ' Visit 360'. Skipping click."); } } catch (err) { WDS.log.error("Error: " + err); } finally { WDS.log.info("Browser window closed, session ended."); }
方案2:统一使用quit()关闭所有窗口
移除代码中的WDS.browser.close(),仅在finally块中调用quit()——该方法会关闭所有打开的窗口并终止会话:
var handles = WDS.browser.getWindowHandles().toArray(); WDS.browser.switchTo().window(handles[handles.length - 1]); java.lang.Thread.sleep(3000); WDS.log.info("(ACO Dashboard Visit 360 Map) Page load correctly."); } } else { WDS.log.info("The Trimmed text does not contain ' Visit 360'. Skipping click."); } } catch (err) { WDS.log.error("Error: " + err); } finally { WDS.browser.quit(); WDS.log.info("WebDriver has been quit."); }
方案3:根据窗口数量选择关闭方式
如果不确定当前是否为最后一个窗口,可先判断窗口数量,剩余1个时用quit(),否则用close():
var handles = WDS.browser.getWindowHandles().toArray(); WDS.browser.switchTo().window(handles[handles.length - 1]); java.lang.Thread.sleep(3000); // 根据窗口数量选择关闭方式 if (handles.length === 1) { WDS.browser.quit(); WDS.log.info("WebDriver has been quit."); } else { WDS.browser.close(); WDS.log.info("Current browser window closed."); } WDS.log.info("(ACO Dashboard Visit 360 Map) Page load correctly."); } } else { WDS.log.info("The Trimmed text does not contain ' Visit 360'. Skipping click."); } } catch (err) { WDS.log.error("Error: " + err); }
内容的提问来源于stack exchange,提问作者ritah

