我想做这样的事情(注意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而不是字符串?
答案 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);
}
如果您还没有将当前页面设置为某个对象,那么您可以循环遍历所有寻找属性的页面对象,但我认为这将导致将来出现问题,您最好只设置当前页面页面某处。