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.wait
和 getText
是可用的,所以它实际上并不等待它们。
猜测它为什么打印它正在打印的内容
你为什么要按那个顺序得到那个文本?我要做一些猜测。如果你执行 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。需要解决承诺,使函数异步并使用等待。
在我的 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.wait
和 getText
是可用的,所以它实际上并不等待它们。
猜测它为什么打印它正在打印的内容
你为什么要按那个顺序得到那个文本?我要做一些猜测。如果你执行 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。需要解决承诺,使函数异步并使用等待。