Protractor判断元素是否存在报错:返回对象而非布尔值
解决Protractor中isPresent()返回对象而非布尔值的问题
嘿,我来帮你搞定这个问题!你遇到的核心问题是没摸透Protractor里Promise的异步特性——isPresent()返回的不是直接的布尔值,而是一个Promise对象,这就是你看到AssertionError: expected { Object (flow_, stack_, ...) } to equal true报错的原因。
你写的这段代码里,虽然用了.then()处理,但整个表达式最终返回的还是Promise,不是你以为的true/false。当你直接把这个结果拿去做断言的时候,自然会报错说期望布尔值但拿到了Promise对象。
给你两种靠谱的解决方案:
方案一:用async/await(最推荐,代码最清晰)
要确保你的测试函数是async的,然后用await等待Promise解析出实际值:
// 定义一个异步函数来检查元素是否存在 async function isElementPresent() { const present = await element(by.id('id1')).isPresent(); return present; // 这里返回的就是真正的布尔值了 } // 断言的时候也要用await获取结果 expect(await isElementPresent()).toEqual(true);
async/await是处理Promise的语法糖,能让异步代码看起来像同步的,await会暂停代码执行,直到Promise完成,直接返回解析后的结果。
方案二:在.then()回调里做断言
如果你暂时不想用async/await,也可以把断言逻辑放在.then()的回调函数里,因为回调里拿到的present才是Promise解析后的布尔值:
element(by.id('id1')).isPresent().then(present => { expect(present).toEqual(true); // 在这里面断言就没问题啦 });
另外要注意,isDisplayed()也是同样的逻辑,它同样返回Promise,必须用await或者.then()来获取实际的布尔值,不能直接拿它返回的对象去断言哦。
内容的提问来源于stack exchange,提问作者Mano Kugan
相关产品推荐
相关产品推荐

