WebdriverJS : driver.manage().logs().get('browser') returns 空数组
WebdriverJS : driver.manage().logs().get('browser') returns empty array
我有以下 mocha 测试用例,我试图在最后打印 webdriver 日志,但它返回一个空数组。即使我将 'browser' 作为参数传递给 logs().get(),结果也是一样的。谁能告诉我为什么日志是空的?
it('should open a url', function(done){
var By = nemo.wd.By;
driver.manage().logs();
driver.get("http://www.google.com");
driver.findElement(By.name('q')).sendKeys("webdriver");
driver.findElement(By.name('btnG')).click()
driver.manage().logs().get('driver').then(function(logs){
console.log(logs);
done();
});
});
这是因为我在创建驱动程序实例时没有在功能列表中启用日志记录选项。现在已通过这些更改解决。
var pref = new webdriver.logging.Preferences();
pref.setLevel('browser', webdriver.logging.Level.ALL);
pref.setLevel('driver', webdriver.logging.Level.ALL);
var driver = new webdriver.Builder()
.withCapabilities(webdriver.Capabilities.firefox())
.setLoggingPrefs(pref).build();
这也取决于所使用的浏览器驱动程序 - 例如对于 chromedriver >= 2.29,日志有时是 'late' - logs().get('performance')
promise 解析为空数组,但等待后它解析为数据。这与 Oscar 的能力调整相同。所以,这里有一个解决方法:
function getPerfLogs(driver) {
let performanceLogs;
return driver.wait(() => {
return driver.manage().logs().get('performance')
.then(v => {
let nonEmpty = v.length > 0;
if (nonEmpty) {
performanceLogs = v;
}
return nonEmpty;
})
}, 1000)
.then(() => {
return performanceLogs;
});
}
getPerfLogs(driver)
.then(v => console.log('performance logs', v))
@Artem 的回答验证了我所看到的行为,但我为我的案例找到了不同的解决方案,使用量角器:在访问日志之前显式调用 browser.waitForAngular()
:
return item.click()
.then(function() {
// "Protractor automatically applies this command before every WebDriver action",
// but apparently browser.manage().logs() is not an action. Without this line
// here, logs are sometimes not picked up until some time later.
return browser.waitForAngular()
})
.then(function() { return browser.manage().logs().get('browser') })
.then(function(logs) { ... });
https://www.protractortest.org/#/api?view=ProtractorBrowser.prototype.waitForAngular
我有以下 mocha 测试用例,我试图在最后打印 webdriver 日志,但它返回一个空数组。即使我将 'browser' 作为参数传递给 logs().get(),结果也是一样的。谁能告诉我为什么日志是空的?
it('should open a url', function(done){
var By = nemo.wd.By;
driver.manage().logs();
driver.get("http://www.google.com");
driver.findElement(By.name('q')).sendKeys("webdriver");
driver.findElement(By.name('btnG')).click()
driver.manage().logs().get('driver').then(function(logs){
console.log(logs);
done();
});
});
这是因为我在创建驱动程序实例时没有在功能列表中启用日志记录选项。现在已通过这些更改解决。
var pref = new webdriver.logging.Preferences();
pref.setLevel('browser', webdriver.logging.Level.ALL);
pref.setLevel('driver', webdriver.logging.Level.ALL);
var driver = new webdriver.Builder()
.withCapabilities(webdriver.Capabilities.firefox())
.setLoggingPrefs(pref).build();
这也取决于所使用的浏览器驱动程序 - 例如对于 chromedriver >= 2.29,日志有时是 'late' - logs().get('performance')
promise 解析为空数组,但等待后它解析为数据。这与 Oscar 的能力调整相同。所以,这里有一个解决方法:
function getPerfLogs(driver) {
let performanceLogs;
return driver.wait(() => {
return driver.manage().logs().get('performance')
.then(v => {
let nonEmpty = v.length > 0;
if (nonEmpty) {
performanceLogs = v;
}
return nonEmpty;
})
}, 1000)
.then(() => {
return performanceLogs;
});
}
getPerfLogs(driver)
.then(v => console.log('performance logs', v))
@Artem 的回答验证了我所看到的行为,但我为我的案例找到了不同的解决方案,使用量角器:在访问日志之前显式调用 browser.waitForAngular()
:
return item.click()
.then(function() {
// "Protractor automatically applies this command before every WebDriver action",
// but apparently browser.manage().logs() is not an action. Without this line
// here, logs are sometimes not picked up until some time later.
return browser.waitForAngular()
})
.then(function() { return browser.manage().logs().get('browser') })
.then(function(logs) { ... });
https://www.protractortest.org/#/api?view=ProtractorBrowser.prototype.waitForAngular