我搜索了所有内容,发现有多篇关于SpecFlow的关于Bodi异常的文章,但它们都与TestStack无关,怀特也没有,并且在我的情况下都没有响应。
我正在使用以下内容:
我正在尝试使用现有接口将自动化元素转换为TestStack.White UIItem
UIItemFactory itemFactory { get; set; }
ActionListener actionListener { get; set; }
public UIItemFactoryHelper(UIItemFactory itemFactory, ActionListener actionListener)
{
this.itemFactory = itemFactory;
this.actionListener = actionListener;
}
public virtual IUIItem CreateIUIItemFromAutoElement(AutomationElement automationElement)
{
var item = itemFactory.Create(automationElement, actionListener);
return item;
}
然后我像这样使用它
private DataGrid GetGrid(ParameterizedString Id, Window window = null)
{
var form = ScenarioContext.Current["activeForm"];
var tab = ScenarioContext.Current["activeTab"];
var parent = GetElementParent(form.ToString(), Id.parentLevel, tab.ToString());
if (window == null)
{
window = WindowHelper.GetWindow();
}
var parentUIItem = uiItemFactoryHelper.CreateIUIItemFromAutoElement(parent);
var element = parentUIItem.Get<DataGrid>(SearchCriteria.ByText("DataGrid"));
return element;
}
运行测试时,出现以下错误
消息:测试方法SmokeTests.SmokeTestSpec.SmokeTestsFeature.EditsAreSaved 抛出异常: BoDi.ObjectContainerException:无法解析接口:TestStack.White.Factory.UIItemFactory
我尝试将容器注册到ScenarioHooks中,并将接口注册到Before Scenario钩子中。当我这样做时,我会得到完全一样的东西。
class ScenarioHooks
{
IObjectContainer objectContainer;
public XmlHelper xmlHelper { get; set; }
public ScenarioHooks(XmlHelper xmlHelper, IObjectContainer objectContainer)
{
this.xmlHelper = xmlHelper;
this.objectContainer = objectContainer;
}
[BeforeScenario]
protected void RegisterInterfaces()
{
objectContainer.ResolveAll<UIItemFactory>();
}
}
我已经使用SpecFlow很长时间了,但是我总是被这种容器注入的东西卡住了。我已经阅读了文档并搜索了各个站点,但是无法正常工作。
欢迎提出任何建议。我完全被困在这里。
答案 0 :(得分:1)
BoDi只能在有接口注册后才能解析该接口。
要获取UIItemFactory
接口的实例,您必须注册一个实现。
在您的RegisterInterfaces
方法中,您没有注册接口,而是在解决接口。您必须将行objectContainer.ResolveAll<UIItemFactory>()
更改为objectContainer.RegisterTypeAs<THE_IMPLEMENTATION, UIItemFactory>()
答案 1 :(得分:0)
如果有人在这里使用TestStack.White将自动化元素转换为UIItem的问题,上面的问题就太复杂了。
事实证明,您可以通过执行以下操作来隐式执行此操作。
public virtual IUIItem CreateIUIItemFromAutoElement(AutomationElement automationElement)
{
var element = new UIItem(automationElement, new NullActionListener());
return element;
}
您可以具有一个空的动作侦听器,只需创建在AutomationElement中传递的新UIItem。这将隐式调用UIItemFactory.Create方法,从而无需为显式调用注册接口。