在Protractor与TypeScript环境下,如何正确比较element.getAttribute('value')的返回值与字符串?
解决Protractor+TypeScript中文本框value与字符串比较的问题
你踩的坑其实是Protractor异步API的典型问题——getAttribute("value")返回的不是直接的字符串,而是一个Promise<string>,你之前的代码没处理这个异步逻辑,导致拿Promise对象和字符串做比较,自然永远返回false,TypeScript的报错也正是因为类型不匹配(String和Promise<string>没有交集)。
为什么之前的写法不对?
看你原来的代码:
async getName(option) { if(option == this.name.getAttribute("value").toString()){ return true; } else{ return false; } }
这里this.name.getAttribute("value")是一个Promise对象,调用toString()只会得到类似"[object Promise]"的字符串,和你传入的实际文本肯定不相等,所以不管option传什么,都会走else分支返回false。
正确的写法:await异步结果
因为你的方法已经标记了async,直接用await获取getAttribute的实际返回值再做比较就行:
async getName(option: string): Promise<boolean> { // 先await拿到实际的value字符串 const inputValue = await this.name.getAttribute("value"); // 再和传入的option做全等比较 return inputValue === option; }
关于你尝试的另一种方式
如果你想让方法直接返回value,再在外部比较,也要记得在调用时await这个方法的结果:
// 定义获取值的方法 async getInputValue(): Promise<string> { return this.name.getAttribute("value"); } // 调用时 const actualValue = await getInputValue(); // 外部做比较 const isMatch = actualValue === "你的预期字符串";
额外提示:用Protractor的expect语法更简洁
其实Protractor的expect已经支持直接处理Promise,你甚至可以不用自己写方法,直接这样断言:
expect(this.name.getAttribute("value")).toBe("你的预期文本");
Protractor会自动等待Promise resolve后再做比较,省去手动await的步骤。
内容的提问来源于stack exchange,提问作者Nick Ward
相关产品推荐
相关产品推荐

