2014-09-02 25 views
2

我正在自动化Windows应用程序。我试图在选项卡控件下访问窗格元素(具有文本框,组合框控件),但它不可访问。白色返回null。白/ UI自动化无法识别标签中的容器(窗格控件)

我尝试了其他技术,如UI自动化TreeWalker(Rawview,控制视图,内容视图),但没有什么帮助。

参考图像下面的链接: https://dl.dropboxusercontent.com/u/68446125/Tab.png https://dl.dropboxusercontent.com/u/68446125/General%20Pane.png

正如图1,标签控制是由白/ UI自动化正确检索,但子元素不会返回通用*面板,它的控制是不可访问(请参阅图2突出显示),第一个可访问的子元素是“常规*选项卡项目”。

奇怪的是,这些控件可以在Inspect.exe(在Windows SDK中)访问。我试过以下方法来检索控件,但通用*窗格永远不能通过白/ UI自动化访问。

var tab = Window.Get<Tab>(SearchCriteria.ByControlType(ControlType.Tab).AndByClassName("TwoPageControl")); // Tab control is retrieved properly 
var pane = tab.GetElement(SearchCriteria.ByControlType(ControlType.Pane).AndByText("General*")); // this line returns NULL 

var pane1 = revWindow.GetElement(SearchCriteria.ByControlType(ControlType.Pane).AndByText("General*")); // this line returns NULL 
var pane2 = revWindow.Get<Panel>(SearchCriteria.ByControlType(ControlType.Pane).AndByText("General*"));// throws exception "Failed to get ControlType=pane,Name=General*,ControlType=pane" 

尝试了Windows UI自动化代码,但没有运气。

System.Windows.Automation.Condition cd1 = new AndCondition(
       new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Tab), 
       new PropertyCondition(AutomationElement.ClassNameProperty, "TwoPageControl"));  

      AutomationElement a = window.FindFirst(TreeScope.Descendants, cd1); // Tab control is returned properly here 

      TreeWalker rawViewWalker = TreeWalker.RawViewWalker; 
      AutomationElement cc = rawViewWalker.GetFirstChild(a); // General * Pane is not returned, instead General* Tab item is returned, though it's not the first child. 
      var cd = rawViewWalker.GetNextSibling(cc); // this returns next pane element available, not General * Pane.    

请帮助我如何访问常规*窗格及其在选项卡控制下的儿童。任何帮助深表感谢。

回答

1

我和我的应用程序有完全相同的问题。我使用Inspect和开源UIAVerify,其中Pane元素作为tab元素的子元素可见。但是,当我编译验证为.Net 4.5项目时,Pane元素不被视为选项卡的一部分。只有当我直接指出它时才会出现。我也在主窗口的后代搜索我的窗格元素,但没有任何东西。我认为这与动态创建该窗格内容有关(我的意思是,当您选择不同的tabItem时会有不同的内容)。

我认为你无法从树的角度访问该元素。

我的解决方案是使用AutomationElement.FromPoint方法。 http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.frompoint(v=vs.110).aspx

我也认为这应该有帮助,如果你与开发程序的人联络。 Some controls on a page are not visible for MS UI Automation

0

您可以将TabControl分解为仅TabPanel,但没有其ContentPresenter。您可以创建自己的ContentPresenter,它使用所选TabItem的内容。

这样,White将能够发现ContentPresenter中的控件。

这是一个解决方法,它是一个耻辱,你必须改变你的WPF代码只是因为“UIA出了问题”。但这是我能做的最好的。

<Grid> 

    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <TabControl x:Name="uiTab" Grid.Row="1"> 

     <TabControl.Template> 
     <ControlTemplate TargetType="TabControl"> 
      <TabPanel IsItemsHost="True" VerticalAlignment="Stretch"/> 
     </ControlTemplate> 
     </TabControl.Template> 

     <TabItem Header="first"> 
     <Button>FIRST</Button> 
     </TabItem> 
     <TabItem Header="second"> 
     <Button>SECOND</Button> 
     </TabItem> 

    </TabControl> 

    <ContentPresenter Content="{Binding SelectedItem.Content, ElementName=uiTab}"/> 

    </Grid>