我在 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
}
然后我运行以下函数:
/// <summary>
/// Check whether new blogs are in browser console and captures them if any.
/// </summary>
/// <returns>Logs from browser console</returns>
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;
}
}
/// <summary>
/// Delete all previous entrys form browser console, so only new ones will be captured
/// </summary>
private void ClearConsole()
{
var jsScript = "console.everything =[];";
((IJavaScriptExecutor)_driver.Driver).ExecuteScript(jsScript);
}
此函数采用带有日志 (Json) 的数组,并在 .NET Json 库的帮助下将其转换为 C# 对象。
每次记录日志时我都会清除对象,因为我只想检查新对象,如果此行为不适合您,您可以删除此函数的调用并保留所有测试的日志