我已经搜索了各地,并发现了多个关于SpecFlow的博迪异常的帖子,但是没有一个是TestStack.White的,也没有一个在我的情况下有效。
我使用的方法如下:
我试图使用现有接口将自动化元素转换为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中注册容器,并在预场景钩子中注册接口。当我这样做的时候,我得到了完全一样的东西。
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已经很长时间了,但是我总是被这个容器注入的东西卡住了。我已经阅读了文档并搜索了不同的网站,但我无法做到这一点。
欢迎任何建议。我完全被困在这里了。
发布于 2018-12-18 12:19:13
BoDi和其他每一个DI容器一样,只有在接口注册时才能解析它。
要获得UIItemFactory接口的实例,必须注册一个实现。
在RegisterInterfaces方法中,不是注册接口,而是解析接口。您必须将行objectContainer.ResolveAll<UIItemFactory>()更改为objectContainer.RegisterTypeAs<THE_IMPLEMENTATION, UIItemFactory>()
发布于 2018-12-18 18:47:36
如果有人在这里讨论将自动化元素转换为TestStack.White的UIItem问题,我的问题太复杂了。
结果表明,您可以通过执行以下操作来隐式地执行此操作。
public virtual IUIItem CreateIUIItemFromAutoElement(AutomationElement automationElement)
{
var element = new UIItem(automationElement, new NullActionListener());
return element;
}您可以有一个空操作监听器,只需创建传入AutomationElement的新AutomationElement。这将隐式调用UIItemFactory.Create方法,从而消除了为显式调用注册接口的需要。
https://stackoverflow.com/questions/53819783
复制相似问题