无论如何,我可以将此方法更改为不需要对象,只需传递参数表达式:
protected void FillInTextFor<T>(T obj, Expression<Func<T, object>> property)
{
var memberExpression = (MemberExpression)property.Body;
var propertyInfo = (PropertyInfo)memberExpression.Member;
// read value with reflection
var value = (string)propertyInfo.GetValue(obj, null);
// use the name and value of the property
FillInText(propertyInfo.Name, value);
}
protected void FillInText(String elementId, String text)
{
VerifyElementPresent(elementId);
Driver.FindElement(By.Id(elementId)).Clear();
Driver.FindElement(By.Id(elementId)).SendKeys(text);
}
叫做
var personToCreate = new PersonBuilder().RandomFirstName().Build();
FillInTextFor(personToCreate, a => a.FirstName);
我希望能够说FillInTextFor(_ => personToCreate.FirstName);
或类似的东西
我们正在尝试为Selenium测试制作辅助方法。我想传递一个对象并选择一个属性,它会自动使用属性的名称作为元素id,将文本作为字符串的值。
答案 0 :(得分:3)
你可以像这样创建一个重载:
protected void FillInTextFor<T>(Expression<Func<T>> property)
{
var memberExpression = (MemberExpression)property.Body;
var propertyInfo = (PropertyInfo)memberExpression.Member;
var compiled = property.Compile();
var value = compiled();
FillInText(propertyInfo.Name, value as string);
}
并使用以下方式调用它:
var personToCreate = new PersonBuilder().RandomFirstName().Build();
FillInTextFor(() => personToCreate.FirstName);