You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:23:34