![](/img/trans.png)
[英]typeof typeof x returns string and not object since type of null is 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.wait
和getText
是 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;
});
});
}
使用類型檢查和異步/等待更容易:
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.