簡體   English   中英

typeof 返回字符串但控制台記錄 [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的值。

建議:遷移出控制流

我強烈建議離開控制流並使用異步/等待。 使用控制流時,Protractor 將所有異步調用排隊並按順序執行,實際上並不逐行運行。 請參閱https://youtu.be/6aPfHrSl0Qk?t=976 (我們在此討論不推薦使用的控制流以及 Protractor 實際上在幕后所做的事情)。

討論:承諾不進入控制流

那么為什么這不起作用呢? Protractor 采用getElementText function 並假設這可能是可用的並將其放入隊列中。 那太棒了; 但是,隊列不知道browser.waitgetText是 thenable 的,因此它實際上並不等待它們。

猜測它為什么要打印它正在打印的東西

你為什么要按那個順序得到那個文本? 我會做一些猜測。 如果您執行getElementText而不將內容放在控制流上,它不會等待browser.wait然后在下一行var elementText = element.getText().toString()將 promise 轉換為字符串並打印“字符串”。 接下來發生的事情是console.log(typeof foo)打印 typeof 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]"

第三條語句在正確執行第一條語句之前打印 foo 的值。 element.getText() 的返回類型是 promise.Promise。 需要解決 promise,使 function 異步並使用等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM