我在使用C#的selenium时遇到了相同的问题,我想展示我的解决方法,适用于所有浏览器(在C#中)
首先,我将网站生成的所有日志重定向到一个数组中存储所有日志。
同时,我将onerror函数重定向以收集所有JavaScript错误。
private void BindConsole(IWebDriver webDriver)
{
var script = "if (console.everything === undefined) {
console.everything = [];
console.defaultLog = console.log.bind(console);
console.log = function(){
const args = Array.prototype.slice.call(arguments).join('_');
console.everything.push({ 'Type':'Log', 'Datetime':Date().toLocaleString(), 'Value':args});
console.defaultLog.apply(console, arguments);
}
console.defaultError = console.error.bind(console);
console.error = function(){
const args = Array.prototype.slice.call(arguments).join('_');
console.everything.push({ 'Type':'Error', 'Datetime':Date().toLocaleString(), 'Value':args});
console.defaultError.apply(console, arguments);
}
console.defaultWarn = console.warn.bind(console);
console.warn = function(){
const args = Array.prototype.slice.call(arguments).join('_');
console.everything.push({ 'Type':'Warn', 'Datetime':Date().toLocaleString(), 'Value':args});
console.defaultWarn.apply(console, arguments);
}
console.defaultDebug = console.debug.bind(console);
console.debug = function(){
const args = Array.prototype.slice.call(arguments).join('_');
console.everything.push({ 'Type':'Debug', 'Datetime':Date().toLocaleString(), 'Value':args});
console.defaultDebug.apply(console, arguments);
}
window.onerror = function(message, url, linenumber) {
console.error('JavaScript error: ' + message + ' on line ' +
linenumber + ' for ' + url);
}
}";
((IJavaScriptExecutor)webDriver).ExecuteScript(script);
}
注意:在进行测试之前,您需要运行此函数,因为日志不会被捕获,并且每次刷新或更改页面时重新运行它(在刷新/更改所有日志时都将丢失,因此请提前保存)。
然后,我有一个对象,与我的函数中的日志签名匹配。
public class LogEntry
{
public LogType Type { get; set; }
public string Datetime { get; set; }
public string Value { get; set; }
}
public enum LogType
{
Error,
Warn,
Log,
Debug
}
然后我运行以下函数:
public IEnumerable<LogEntry> GetAllConsoleLogs()
{
SystemTools.Delay();
var jsScript = "return console.everything";
var list = ((IJavaScriptExecutor)_driver.Driver).ExecuteScript(jsScript) as IReadOnlyCollection<object>;
if (list!=null && list.Count > 0) {
var token = JArray.FromObject(list);
ClearConsole();
return token.ToObject<IEnumerable<LogEntry>>();
} else {
return null;
}
}
private void ClearConsole()
{
var jsScript = "console.everything =[];";
((IJavaScriptExecutor)_driver.Driver).ExecuteScript(jsScript);
}
这个函数接受一个包含日志的数组(Json格式),并利用.NET Json库将其转换为C#对象。
每次获取日志时,我清除对象,因为我只想检查新的日志。如果这种行为不适合您,可以删除调用此函数并保留所有测试的日志。
.get(LogType.BROWSER)
,而不是.get("client")
。你代码中的能力部分没问题。 - undefined