您如何将 element.getAttribute() 的值与量角器中的字符串进行比较?

How would you compare the value of element.getAttribute() to a String in protractor?

使用量角器和打字稿,我希望能够将 element.getAttribute("value") 的结果值与字符串进行比较,以验证文本框中的文本是否已成功保存。 getText() 在这种情况下不起作用,因为输入到字段(可编辑文本框)中的文本不会保存为元素的文本属性。这是我的方法:

  async getName(option) {
    if(option == this.name.getAttribute("value").toString()){
      return true;
    }
    else{
      return false;
    }
  }

这总是 returns 错误,即使传递了正确的值。但是我知道 name.getAttribute("value") 正在返回正确的值,因为当我将结果输出到控制台时,它显示的是正确的值。

当我从上述方法中输入 option 作为 string 时,出现以下错误:This condition will always return 'false' since the types 'String' and '() => string' have no overlap.ts(2367)。我假设这与 protracor 返回承诺有关,但我不确定是否有任何其他方法可以将文本与预期值进行比较。

编辑:我还应该注意,我也尝试过另一种方式,该方法只是返回 name.getAttribute("value") 的结果,然后将结果与我期望的字符串进行比较,而不是全部完成方法并期望它是真的。

getAttribute 将 return 一个承诺,因此它应该被解决以捕获价值,我们应该能够使用下面的方法验证这一点

expect(this.name.getAttribute("value")).toEqual('bar');

如果您想获取值并将其分配给另一个变量,您可以使用

this.name.getAttribute("value").then(function (value) {
    foo = vale
});

调试时保持一致。

  1. .getAttribute("value")return承诺
  2. Promise 是一个对象
  3. Object.toString() returns "[object Object]"
  4. 最后你将 "[object Object]""result" 进行比较,后者总是 false

要解决此问题,请不要忘记解决 Promise。不要试图将所有内容都放在一行中,这会使您的代码不可读且不可调试。对了,.getAttribute("value") return String 反正不用调用toString()。并且不要使用 ==,始终使用 ===(我在 4 年自动化经验后得出的结论)

使用这个

async getName(option) {
  let value = await this.name.getAttribute("value")
  if(option === value){
    return true;
  } else {
    return false;
  }
}
// or even better
async getName(option) {
  let value = await this.name.getAttribute("value")
  return option === value
}

但是,您的代码仍然令人困惑。为什么?因为您的方法名为 get name,但 returned 值根本不是名称,它是 returns 布尔值。所以最好是明确的,例如 nameEqualsValue 这样的东西