locked
wp7自动化测试,如何获取ApplicationBarIconButton的按钮控件,并点击? RRS feed

  • 问题

  • UI Automation test,发现ApplicationBarIconButton没有继承System.Windows.Controls中的类,而是wp7自己的一套东西,MS现在有没有相应的automationpeer接口实现对这个控件的UI 自动点击?如果没有怎么解决这个问题?

    2012年2月28日 8:09

答案

  • 增加了一段自动触发的方法.

    把按钮分别申明为:

     var button = this.ApplicationBar.Buttons[0] as ApplicationBarIconButton;
     var buttonUI = this.ApplicationBar.Buttons[0] as MyApplicationBarIconButton;

    一个处理真实的Click事件,一个处理代码的Click事件,绑定的是同一个

    void button_Click(object sender, EventArgs e)
            {
     
            }

    2012年2月29日 9:22
  • 你好,如果你要改成Button,那么就不能使用官方提供的按钮方案了,就是说,以下代码必须加上注释,然后创建自己的一套按钮方案

        <phone:PhoneApplicationPage.ApplicationBar>
            <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
                <shell:ApplicationBar.MenuItems>
                    <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
                    <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
                </shell:ApplicationBar.MenuItems>
            </shell:ApplicationBar>
        </phone:PhoneApplicationPage.ApplicationBar>

    因为ApplicationBarIconButton是一个完全脱离于Button系统的一个自定义Button(我个人认为连Button都算不上,实际,ApplicationBarIconButton只是一个用来储存数据的中间类,因为它直接继承自Object,而Button继承自FrameworkElement)

    2012年3月1日 7:38

全部回复

  • Hi,

    原生的代码的确没有提供原生的自动UI点击事件

    但是ApplicationIconBar是个非常简单的类,你可以进行反编译,然后创建一个你自己的MyApplicationBarIconButton

    然后创建一个方法,提供手动点击事件

    2012年2月29日 3:09
  • MyApplicationBarIconButton是不是要继承Button,Button控件有ButtonAutomationPeer的接口,但是这样,button不能add到ApplicationBar上的Buttons了吧,你是说的这个意思吗?多谢了

    public class MyApplicationBarIconButton : Button, IApplicationBarIconButton
        {
            public MyApplicationBarIconButton()
            {    
            }
            public MyApplicationBarIconButton(Uri iconUri,String text)
            {
                IconUri = iconUri;
                Text = text;
            }
            public string Text { get; set; }
            public  event EventHandler Click;
            public Uri IconUri { get; set; }
            public bool IsEnabled { get; set; }
        }

    2012年2月29日 7:42
  • 你好,

    我误解了你的意思,我以为你只要实现代码进行按钮点击.

    ApplicationBarIconButton并不能拥有automationpeer接口的功能,因为ApplicationBarIconButton的点击功能是存在于IApplicationBarMenuItem接口中的

    ApplicationBarIconButton和Button的机制是不一样的.

    如果你想使用代码进行UI点击的话是可行的,但是使用automationpeer接口据我所知暂时是无法实现

    如果要实现用代码进行UI点击,需要重复ApplicationBarIconButton的代码,然后再提供一个方法进行UI点击

        public class MyApplicationBarIconButton : IApplicationBarIconButtonIApplicationBarMenuItem
        {
            //其他代码(需要复制ApplicationBarIconButton的其他带代码)
            public event EventHandler Click;
            public void UIClickViaCode()
            {
                if (Click != null)
                {
                    Click(thisnew EventArgs());
                }
            }
            //-------------------------------------
        }



    2012年2月29日 7:53
  • 多谢版主!另外反编译后的ApplicationBarIconButton代码,是这个吗?怎么感觉少了点东西?
    // Type: Microsoft.Phone.Shell.ApplicationBarIconButton
    // Assembly: Microsoft.Phone, Version=7.0.0.0, Culture=neutral, PublicKeyToken=24eec0d8c86cda1e
    // Assembly location: C:\Program Files\Reference Assemblies\Microsoft\Framework\Silverlight\v4.0\Profile\WindowsPhone71\Microsoft.Phone.dll
    
    using System;
    
    namespace Microsoft.Phone.Shell
    {
        /// <summary>
        /// An Application Bar button with an icon.
        /// </summary>
        public class ApplicationBarIconButton : IApplicationBarIconButton, IApplicationBarMenuItem
        {
            /// <summary>
            /// Creates a new instance of the <see cref="T:Microsoft.Phone.Shell.ApplicationBarIconButton"/> class.
            /// </summary>
            public ApplicationBarIconButton();
    
            /// <summary>
            /// Creates a new instance of the <see cref="T:Microsoft.Phone.Shell.ApplicationBarIconButton"/> class with the specified icon.
            /// </summary>
            /// <param name="iconUri">The URI of the icon to use for the button.</param>
            public ApplicationBarIconButton(Uri iconUri);
    
            /// <summary>
            /// The URI of the icon to use for the button.
            /// </summary>
            /// 
            /// <returns>
            /// The URI of the icon to use for the button.
            /// </returns>
            public Uri IconUri { get; set; }
    
            /// <summary>
            /// Gets or sets the enabled status of the button.
            /// </summary>
            /// 
            /// <returns>
            /// true if the button is enabled; otherwise, false.
            /// </returns>
            public bool IsEnabled { get; set; }
    
            /// <summary>
            /// Gets or sets the text string that is displayed as a label for the button. The label is displayed when the user taps the ellipses symbol on the Application Bar.
            /// </summary>
            /// 
            /// <returns>
            /// Type: <see cref="T:System.String"/>.
            /// </returns>
            public string Text { get; set; }
    
            /// <summary>
            /// Occurs when the user taps a button in the Application Bar.
            /// </summary>
            public event EventHandler Click;
        }
    }
    

    2012年2月29日 8:08
  • 你好,

    我看了下代码,比我想象的要复杂,我提出的解决方案似乎有点问题,

    我在进行调试,我会尽快给予答复的

    2012年2月29日 8:34
  • 你好,我尝试了下这种方法来进行:
    <local:MyApplicationBarIconButton IconUri="/Images/appbar_button0.png" Text="Button 0"/>
    

            public MainPage()
            {
                InitializeComponent();
                var button = this.ApplicationBar.Buttons[0] as ApplicationBarIconButton;
                var buttonUI = this.ApplicationBar.Buttons[0] as MyApplicationBarIconButton;
                button.Click+=new EventHandler(button_Click);
                buttonUI.Click += new EventHandler(button_Click);
                buttonUI.UIClickViaCode();
            }
     
            void button_Click(object sender, EventArgs e)
            {
     
            }

        public class MyApplicationBarIconButton : ApplicationBarIconButton
        {
            public event EventHandler Click;
            public void UIClickViaCode()
            {
                if (Click != null)
                {
                    Click(thisnew EventArgs());
                }
            }
        }

    2012年2月29日 9:16
  • 增加了一段自动触发的方法.

    把按钮分别申明为:

     var button = this.ApplicationBar.Buttons[0] as ApplicationBarIconButton;
     var buttonUI = this.ApplicationBar.Buttons[0] as MyApplicationBarIconButton;

    一个处理真实的Click事件,一个处理代码的Click事件,绑定的是同一个

    void button_Click(object sender, EventArgs e)
            {
     
            }

    2012年2月29日 9:22
  • 多谢版主,但是由于不能对ApplicationBarIconButton不能实现自动化点击,要改成Button来实现,应该怎么实现?
    2012年3月1日 7:30
  • 你好,如果你要改成Button,那么就不能使用官方提供的按钮方案了,就是说,以下代码必须加上注释,然后创建自己的一套按钮方案

        <phone:PhoneApplicationPage.ApplicationBar>
            <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Button 1"/>
                <shell:ApplicationBarIconButton IconUri="/Images/appbar_button2.png" Text="Button 2"/>
                <shell:ApplicationBar.MenuItems>
                    <shell:ApplicationBarMenuItem Text="MenuItem 1"/>
                    <shell:ApplicationBarMenuItem Text="MenuItem 2"/>
                </shell:ApplicationBar.MenuItems>
            </shell:ApplicationBar>
        </phone:PhoneApplicationPage.ApplicationBar>

    因为ApplicationBarIconButton是一个完全脱离于Button系统的一个自定义Button(我个人认为连Button都算不上,实际,ApplicationBarIconButton只是一个用来储存数据的中间类,因为它直接继承自Object,而Button继承自FrameworkElement)

    2012年3月1日 7:38
  • wp7自动化问题, 不知道现在wp7应用自动化支持怎样,是否可实现UI 黑盒自动化测试,看样子楼主好像是可以的, 希望共享下 非常感谢
    2012年3月13日 6:59