Selenium×Node.js自动化测试遇NoSuchSessionError报错求助
问题分析与解决方案
嗨,我看了你的代码和报错信息,核心问题出在异步操作的执行顺序上!
你写的代码里,browser.get() 和 getTitle() 都是返回Promise的异步操作,但你在发起这些异步请求后,立刻就调用了 browser.close() 和 browser.quit()——这会导致浏览器会话在页面请求还没完成、标题还没获取到的时候就被关闭了,后面的Promise回调执行时自然就找不到会话,抛出NoSuchSessionError。
修正方案1:用Promise链保证顺序
把关闭浏览器的操作放到Promise链的最后,确保所有异步任务完成后再结束会话:
// Initialization of WebDriver const webdriver = require('selenium-webdriver'); // Browser selection const browser = new webdriver.Builder().forBrowser('chrome').build(); // Get page title browser.get('http://example.selenium.jp/reserveApp/') .then(() => browser.getTitle()) .then(title => console.log('Page title:', title)) .finally(() => { // 所有任务完成后关闭并退出浏览器 browser.close(); browser.quit(); }) .catch(err => { // 捕获并处理错误 console.error('Error occurred:', err); browser.quit(); // 出错也要确保浏览器退出 });
修正方案2:用async/await(更简洁易读)
Node.js 8+支持async/await,用这个写法能让异步代码看起来像同步代码,更容易维护:
const webdriver = require('selenium-webdriver'); async function runTest() { let browser; try { // 初始化浏览器 browser = new webdriver.Builder().forBrowser('chrome').build(); // 打开页面 await browser.get('http://example.selenium.jp/reserveApp/'); // 获取标题 const title = await browser.getTitle(); console.log('Page title:', title); } catch (err) { console.error('Test failed:', err); } finally { // 无论成功失败都关闭浏览器 if (browser) { await browser.close(); await browser.quit(); } } } // 执行测试 runTest();
额外小提示
另外,注意你的ChromeDriver版本(2.38)和Chrome浏览器版本要匹配,如果Chrome已经更新到较新版本,可能需要升级ChromeDriver来避免兼容性问题。
内容的提问来源于stack exchange,提问作者KKK
相关产品推荐
相关产品推荐

