如何用Chai断言与Serenity比较两个Protractor定位器的值?
嗨,刚上手Serenity Screenplay和Protractor的话,这种比较两个元素文本值的需求其实挺典型的,我来给你分享几种可行的实现方式~
首先,你之前用expect(actor.toSee(Text.of(locatorClass.test1))).to.eventually.equal("21")能成功,是因为你把Promise解析后和一个常量字符串比较,Chai as Promised的eventually会自动处理actor.toSee(...)返回的Promise。但要比较两个定位器的文本,本质上是要比较两个Promise解析后的结果,这里有两种简洁的写法:
方法1:用Async/Await(最直观易读)
因为Cucumber的Step定义支持async函数,你可以先await两个文本值的Promise,再直接比较:
import { Actor } from '@serenity-js/core'; import { expect } from 'chai'; import { Text } from '@serenity-js/protractor'; import locatorClass from './your-locator-file-path'; Given(/^I verify test1 and test2 have the same value$/, async function (this: Actor) { // 先获取两个元素的文本值 const test1Text = await this.toSee(Text.of(locatorClass.test1)); const test2Text = await this.toSee(Text.of(locatorClass.test2)); // 直接用Chai断言比较 expect(test1Text).to.equal(test2Text); });
方法2:用Chai as Promised的链式断言
如果你不想用async/await,也可以直接让Chai自动处理两个Promise的解析:
Given(/^I verify test1 and test2 have the same value$/, function (this: Actor) { return expect(this.toSee(Text.of(locatorClass.test1))) .to.eventually.equal(this.toSee(Text.of(locatorClass.test2))); });
这里要注意加上return,因为Cucumber需要等待Promise完成,否则步骤会被标记为成功但实际断言还没执行。
额外提示
- 确保你已经正确配置了Chai as Promised,一般在你的Protractor配置文件里会有类似这样的代码:
import * as chai from 'chai'; import * as chaiAsPromised from 'chai-as-promised'; chai.use(chaiAsPromised); - 如果需要更复杂的比较(比如忽略大小写、包含关系),可以在获取到文本值后用Chai的其他断言方法,比如
expect(test1Text.toLowerCase()).to.equal(test2Text.toLowerCase())之类的。
内容的提问来源于stack exchange,提问作者Upa A
相关产品推荐
相关产品推荐

