4

无论如何我可以将这个方法更改为不需要对象,而只需传递一个参数表达式:

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,并将文本作为字符串的值。

4

1 回答 1

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);
于 2013-03-13T12:39:48.340 回答