Specflow:传递一个IWebElement槽步参数转换

时间:2015-05-19 15:26:47

标签: c# selenium-webdriver specflow

我想做这样的事情(注意IWebDriver而不是典型的字符串)

[Given(@"I select ""(.*)"" option")]
    public void GivenInISelectOption(IWebDriver p0)
    {
        MainMenuPage.SelectOption(p0);     
    }

像这样的MainMenuClass:

class MainMenuPage
{
    //spans
    public static IWebElement SetupMenu
    { get { return Configuration.driver.FindElement(By.XPath(".//span[@id='Setup_navItem']")); } }

    public static void SelectOption (IWebElement element)
    {
        element.Click();
    }
}

使用案例应如下:

And I select "SetupMenu" option

问题:是否可以使用步骤参数转换使步骤定义接受IWebElement而不是字符串?

2 个答案:

答案 0 :(得分:0)

我不能说它是否可能,但我无论如何都不会建议。但是,这是一种可以解决问题的方法:

[Given(@"I select ""(.*)"" option")]
public void GivenInISelectOption(string p0)
{
    if(p0.Equals("SetupMenu"){
        MainMenuPage.SelectOption(MainMenuPage.SetupMenu);
    }     
}

这样您仍然可以从stepdef

调用所需的选项

另一种更简单的方法是:

[Given(@"I select ""(.*)"" option")]
public void GivenInISelectOption(string p0)
{
    if(p0.Equals("SetupMenu"){
        MainMenuPage.SetupMenu.Click();
    }     
}

答案 1 :(得分:0)

我认为这是可能的,假设在其他步骤中您已经定义了您正在使用的页面。我将假设您已使用键'CurrentPage'将当前页面放在ScenarioContext中。

我认为您的问题中存在错误,因为您希望将IWebElement而不是IWebDriver传递给您的方法。

我要做的是写一个类似这样的[StepArgumentTransformation]方法(未经测试,假设伪代码,但基本上通过反射获取属性,然后获取其值)。

[StepArgumentTransformation]
public IWebElement TransformToWebElementOnCurrentPage(string elementName)
{
    object currentPage = ScenarioContext.Get("CurrentPage");
    //get the property of the current page with the given name
    var props = currentPage.GetType().GetProperties();
    return (IWebElement) props.First(x=>x.Name==elementName).GetValue(null);
}

如果您还没有将当前页面设置为某个对象,那么您可以循环遍历所有寻找属性的页面对象,但我认为这将导致将来出现问题,您最好只设置当前页面页面某处。