无法对阻止控制异常执行操作?使用Coded UI?

时间:2016-09-07 12:46:35

标签: coded-ui-tests

我正在自动化WPF应用程序,当我记录" WpfComboBox"在该控件上控制并执行选择索引,它会抛出错误,例如"无法对阻塞控制异常执行操作"。请帮我解决这个问题。

WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom.SubDvsnItemTabList.SubDvsnPIPrismPrismExtensioTabPage);
customContr.SearchProperties.Add(WpfControl.PropertyNames.AutomationId, "legalFormatsControl");

WpfComboBox combLegal = new WpfComboBox(customContr);       
combLegal.SearchProperties.Add(WpfComboBox.PropertyNames.AutomationId, "legalFormats");
combLegal.Find();
combLegal.SelectedIndex = 2; 

以上是我的代码,它在combLegal.selectedIndex = 2

中抛出错误

enter image description here

5 个答案:

答案 0 :(得分:3)

此问题的原因:

控件放在一个不可见的控件内,该控件放在父控件中。就像在您的代码中一样,combLegal组合框位于customContr Wpfcontrol中。但是还有另一个控件阻止你访问组合框。设计人员在调试时必须将其用于其他目的,并且忘记在完成后将其删除。

可能的解决方案:

1
。尝试通过其父级访问不可见的控件。

WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom......);
customContr.SearchProperties.Add(....AutomationId, "legalFormatsControl");
foreach(WpfControl TempContr in customContr.GetChildren())
{
  WpfControl ChildContr = TempContr.GetChildren().ElementAt(0);
  if(ChildContr is WpfComboBox)
    {
     combLegal.SelectedIndex = 2;
     break;
    }
}



2.尝试通过检查宽度来访问控件。

WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom......);
customContr.SearchProperties.Add(....AutomationId, "legalFormatsControl");
foreach(WpfControl TempContr in customContr.GetChildren())
{
   if(TempContr.BoundingRectangle.Width>0)
      {
        combLegal.SelectedIndex = 2;
        break;
      }
}



3.尝试通过检查父级的宽度来访问控件。

  WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom......);
    customContr.SearchProperties.Add(....AutomationId, "legalFormatsControl");
    foreach(WpfControl TempContr in customContr.GetChildren())
    {
       if(TempContr.BoundingRectangle.Width>0)
         {
           WpfControlCollection Collection = TempContr.GetChildren();
           foreach(WpfControl combLegal in Collection)
             {
               if(combLegal is WpfComboBox)
                 {
                  combLegal.SelectedIndex = 2;
                   break;
                 }
             }
         }
    }


其中一个应解决您的问题。如果没有,请在下面做评论,我们将进行更多尝试。祝你好运.. !!

答案 1 :(得分:0)

您好我认为您之前已在同一控件上执行了一些其他操作。

最好再次添加相同的控件并使用其他名称重命名,并确保它仅与此单个操作或操作相关联。

这会对你有帮助。

答案 2 :(得分:0)

这在角网络应用程序中发生了很多,其中有一个父控件阻止其下面的“真实”控件,也不会接受直接控制。最终@ Rajesh-S的钱是正确的,有时他的亲子方法优于这个。然而,并不总是答案。

为了解决这个问题,我的团队使用了类似的方法。谨慎使用。

 /// <summary>
/// Clicks any control on a page for the given area.
/// </summary>
/// <param name="controlObject">Control Object to Click</param>
public static void ClickControl(UITestControl controlObject, int offset = 5)
{
    Rectangle clickArea = controlObject.BoundingRectangle;
    Point clickPoint = new Point(clickArea.X + offset, clickArea.Y + offset);
    Mouse.Click(clickPoint);
}

传递任何您获得正确边界框的控件。请记住,偏移量将来自左上角。通常情况下,5可以与大多数控件进行交互。

答案 3 :(得分:0)

public static void ClickCenterOfAControl(UITestControl control)
{
    Point location = control.BoundingRectangle.Location;
    location.Offset(control.BoundingRectangle.Width / 2, control.BoundingRectangle.Height / 2);
    Mouse.Click(location);
}

希望这会起作用

答案 4 :(得分:0)

如果元素是链接或按钮,那么它使用下面的代码行

Mouse.Click(element);

但是,有时我们可能想要点击div标签或span标签而不是链接。为此,如果点击的位置不明确,那么我们也会遇到这种类型的错误。

为此,我们可以使用以下代码行

Mouse.Click(element.BoundingRectangle.Location);