Protractor中如何提取getText()返回的实际文本值?
解决Protractor中getText()返回Promise导致断言失败的问题
你的问题根源很明确:Protractor的getText()方法返回的是Promise对象,而非直接的字符串值。所以你直接把thisLast和thisFirst拼接时,其实是在拼接两个未解析的Promise,自然得到[Object Object] [Object Object]的结果。下面给你两种可行的解决方案,其中第二种更简洁易读。
方案1:使用Promise链式调用(传统写法)
我们可以用Promise.all()并行获取两个文本的解析值,再在后续的then()回调中完成点击和断言操作:
element.all(by.name('nameRow')).count().then(function(size){ const thisNum = Math.floor(Math.random() * size); // 生成0到size-1的随机整数,更可靠 // 并行获取last和first的文本值 return Promise.all([ element.all(by.name('last')).get(thisNum).getText(), element.all(by.name('first')).get(thisNum).getText() ]).then(function([lastText, firstText]) { // 点击选中的行 element.all(by.name('nameRow')).get(thisNum).click(); const newElement = element(by.tagName('h3')); const expectedString = `${firstText} ${lastText}`; // 断言:h3文本包含预期字符串 return expect(newElement.getText()).toContain(expectedString); }); });
方案2:使用async/await(推荐,代码更清晰)
Protractor完全支持ES2017的async/await语法,它能让异步代码看起来像同步代码,极大提升可读性:
async function verifyRandomRowText() { // 获取行总数 const rowCount = await element.all(by.name('nameRow')).count(); // 生成随机行索引 const randomIndex = Math.floor(Math.random() * rowCount); // 获取目标行的元素,避免重复定位 const targetRow = element.all(by.name('nameRow')).get(randomIndex); // 并行获取该行的first和last文本 const [firstText, lastText] = await Promise.all([ targetRow.element(by.name('first')).getText(), targetRow.element(by.name('last')).getText() ]); // 点击目标行 await targetRow.click(); // 获取h3的文本并断言 const headerText = await element(by.tagName('h3')).getText(); const expectedString = `${firstText} ${lastText}`; expect(headerText).toContain(expectedString); } // 执行测试函数 verifyRandomRowText();
额外优化点
- 避免直接调用
thisLast.resolve():Promise的解析必须通过then()或await,直接调用resolve()不是正确的用法。 - 优化元素定位:直接从目标行中查找
first和last元素(targetRow.element(by.name('first'))),比重新调用element.all()更高效,也能避免因DOM变化导致的定位错误。 - 随机数生成:用
Math.floor(Math.random() * size)替代parseInt,能更稳定地生成0到size-1的整数,避免出现超出索引范围的情况。
内容的提问来源于stack exchange,提问作者Reverend Bubbles
相关产品推荐
相关产品推荐

