使用Jest运行Selenium测试用例失败的问题求助
修复Selenium + Jest测试用例未执行及Promise处理问题
你的核心问题是没正确处理Selenium的异步Promise,加上Jest默认不会等待.then链式调用完成就会结束测试,导致内部代码没执行或expect不生效。另外还有元素定位时机和XPath语法的问题,以下是具体修正方案:
关键问题分析
- Selenium的
driver.get()、findElement()、getText()全都是异步方法,返回Promise,你用.then嵌套但没把Promise返回给Jest,Jest会认为测试已完成,跳过后续异步代码。 - 直接调用
findElement()可能在元素还没渲染完成时执行,导致“元素未找到”错误,即使浏览器里能看到元素。 - 你的XPath语法有误:
li[@id='__tile11']是相对路径,应该用绝对路径//li[@id='__tile11']才能全局定位元素。
修正后的代码
const { By, until } = require('selenium-webdriver'); describe('When a user Opens Launchpad', () => { test('It should be able to Navigate to Tasks Application without errors', async () => { // 等待页面加载完成 await driver.get('http://localhost:4004/fiori.html'); // 显式等待元素出现并可交互,最长等待10秒 const tileElement = await driver.wait(until.elementLocated(By.xpath("//li[@id='__tile11']")), 10000); // 等待元素文本加载完成 const tileText = await tileElement.getText(); // 执行断言 expect(tileText).toBe("VT Dashboard"); }, 200000); });
改动说明
- 用
async/await替代.then链式调用:让代码更易读,同时确保Jest等待所有异步操作完成后再结束测试。 - 添加
driver.wait()显式等待:通过until.elementLocated等待元素被DOM定位到,避免因页面渲染延迟导致的元素未找到错误。 - 修正XPath路径:使用
//li全局定位id为__tile11的li元素。 - 等待
getText()的Promise结果:getText()返回Promise,必须用await获取实际文本后再断言。
额外注意事项
- 确保你的Selenium WebDriver版本和Jest版本兼容,避免异步处理的兼容性问题。
- 如果元素需要滚动到可视区域才能交互,可以在获取元素后添加
await driver.executeScript("arguments[0].scrollIntoView();", tileElement);。
内容的提问来源于stack exchange,提问作者Mellacheruvu Janakirama Sarma
相关产品推荐
相关产品推荐

