typeof returns 字符串但控制台记录 [object Object]

typeof returns string but console logs [object Object]

在我的 Protractor 代码中,我注意到了这个奇怪的行为:

let foo = getElementText(element(by.xpath("//wha/t/e/v/e/r")))
console.log(typeof foo) // logs "string"
console.log("foo is " + foo) // logs "[object Object]"

function getElementText(element){
  var EC = protractor.ExpectedConditions
  browser.wait(EC.visibilityOf(element), 5000)
  var elementText = element.getText().toString()
  console.log(typeof elementText)
  return elementText
}

如果我尝试 foo.toString(),它不会改变任何东西。

我想记录 foo 的值。

建议:迁移控制流

我强烈建议停止控制流并使用异步/等待。使用控制流时,量角器将所有异步调用排队并按顺序执行它们,实际上并没有逐行 运行 它们。请参阅 https://youtu.be/6aPfHrSl0Qk?t=976(我们讨论了不推荐使用的控制流以及 Protractor 在幕后实际执行的操作)。

讨论:承诺不会进入控制流程

那么为什么这不起作用?量角器采用 getElementText 函数并假设这可能是可行的并将其放入队列中。那太棒了;但是,队列不知道 browser.waitgetText 是可用的,所以它实际上并不等待它们。

猜测它为什么打印它正在打印的内容

你为什么要按那个顺序得到那个文本?我要做一些猜测。如果你执行 getElementText 而不把事情放在控制流上,它不会等待 browser.wait 然后在下一行 var elementText = element.getText().toString() 将承诺变成一个字符串并打印“字符串” .接下来发生的事情是 console.log(typeof foo) 打印出 webdriver.Promise<string> 的类型 [Object object]。我不确定为什么 "foo is " + foo 没有日志记录。它不会显示在您的日志记录中。

控制流中的修复

(虽然如果你使用控制流,你不会有这个问题)

let foo = getElementText(element(by.xpath("//wha/t/e/v/e/r")))
console.log(typeof foo);
console.log("foo is " + foo);

function getElementText(element) {
  var EC = protractor.ExpectedConditions
  return browser.wait(EC.visibilityOf(element), 5000).then(() => {
    return element.getText().then(elementText => {

      // print stuff
      console.log(typeof elementText);
      console.log(elementText);
      return elementText;
    });
  });
}

修复异步/等待(和 TypeScript)

类型检查和异步/等待让事情变得更容易:

let foo = await getElementText(element(by.xpath("//wha/t/e/v/e/r")));
console.log(typeof foo);
console.log("foo is " + foo);

// prefer renaming element to something else since it is a Protractor API.
async function getElementText(elementWithText): Promise<string> {
  const EC = protractor.ExpectedConditions;

  // I can't remember if you need to await EC.visibilityOf(elementWithText).
  // I think you need to
  await browser.wait(await EC.visibilityOf(elementWithText), 5000);
  const elementText = await element.getText();
  console.log(typeof elementText);
  console.log(elementText);
  return elementText;
}

希望对您有所帮助(如果可行,也请点赞)。

let foo = getElementText(element(by.xpath("//wha/t/e/v/e/r")))
console.log(typeof foo) // logs "string"
console.log("foo is " + foo) // logs "[object Object]"

第 3 条语句甚至在第 1 条语句正确执行之前打印 foo 的值。 Return element.getText() 的类型是 promise.Promise。需要解决承诺,使函数异步并使用等待。