我之前已经多次讨论这个问题了,我不确定这对我来说是否是最好的事情,所以任何改进建议都会受到欢迎。
我正在尝试为我的Selenium测试构建一些详细的日志记录。
我有一个方法调用:
Admin_Login.Username.SetText("MyUsername");
Admin_Login只是一个标准类。但是"用户名"是传递给" SetText"的变量。方法如下所示:
public static void SetText(this By identifier, string value)
{
StackTrace stackTrace = new StackTrace();
string methodName = stackTrace.GetFrame(1).GetMethod().Name;
string className = stackTrace.GetFrame(1).GetMethod().DeclaringType.FullName;
//I do some logging here for the manual testers so they can debug after a run
TestDriver.ResultsLog.LogComment("Class: " + className);
TestDriver.ResultsLog.LogComment("Calling Method: " + methodName);
TestDriver.ResultsLog.LogComment("Calling Element: " + identifier.toString());
IWebElement element = WebDriver.driver.FindElementSafe(identifier);
((IJavaScriptExecutor)WebDriver.driver).ExecuteScript("arguments[0].value = arguments[1]", element, value);
}
供参考,这是Admin类:
public class Admin_Login
{
public static By Username = By.Id("ctl00_MainContent_ctlLoginView_ctlLogin_UserName");
}
所以我可以很好地记录类名和方法名,但我需要知道的是"标识符"传递给方法的变量。
所以价值应该是"用户名"在这种情况下。
我尝试了一些建议,将标识符的名称作为"标识符"但那真的不是我想要的。我需要知道调用SetText方法的对象,如果有意义的话。
正如我所说,也许我没有采用正确的方式,所以任何建议都会有所帮助。
答案 0 :(得分:1)
我无法相信我实际上是在暗示这个解决方案有多脏......但是,这是一个解决方案... sooooo ...
class Program
{
static void Main()
{
var foo = new Foo();
var bar = foo;
foo.Hit();
bar.Hit();
}
}
public static class Extensions
{
public static void Hit(this Foo foo, [CallerMemberName] string name = null, [CallerFilePath] string path = null, [CallerLineNumber] int lineNumber = -1)
{
string callerVariableName;
using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
StreamReader reader = new StreamReader(stream);
string csharpFile = reader.ReadToEnd();
string[] lines = csharpFile.Split('\n');
string callingLine = lines[lineNumber - 1];
Match matchVariableName = Regex.Match(callingLine, @"([a-zA-Z]+[^\.]*)\.Hit\(\)");
callerVariableName = matchVariableName.Groups[1].Value;
}
Console.WriteLine("\n///////////////////////////////");
Console.WriteLine("Caller method name: {0}", name);
Console.WriteLine("Caller variable name: {0}", callerVariableName);
Console.WriteLine("File Path: {0}", path);
Console.WriteLine("Line number: {0}", lineNumber);
}
}
public class Foo
{
}