2017-07-28 18 views
1

Je développe une application Winform C#. J'ai un ruban dans ma forme qui contient plusieurs onglets et plusieurs boutons de ruban. J'utilise l'interface utilisateur codée pour les tests. Le problème que je suis confronté est que je suis incapable de trouver les boutons de ruban utilisant ui codé, chaque fois que je planer sur un contrôle de ruban (disons ribbonbutton), il détecte seulement le ruban, mais pas ce contrôle. Quelqu'un peut-il suggérer si les contrôles du ruban prennent en charge l'interface utilisateur codée pour les tests? Si oui, alors comment puis-je le faire?Contrôles System.Windows.Forms.Ribbon dans CodedUI

+0

Si l'une des solutions ci-dessous vous a été utile, veuillez la marquer comme acceptée. S'il y a toujours un problème, veuillez mettre à jour votre question avec ce que vous avez essayé et ce qui ne fonctionne pas. – MPavlak

Répondre

0

Il existe une autre barre de ruban à l'intérieur de la barre de ruban que vous avez trouvée.

Voici mon code: onglet Fichier bouton Ouvrir

var mainWindow = new WinWindow(app); 
mainWindow.SearchProperties.Add(WinWindow.PropertyNames.ControlName, "frmMain"); 
var ribbonBar = new WinWindow(mainWindow); 
ribbonBar.SearchProperties.Add(WinWindow.PropertyNames.ControlName, "radRibbonBar"); 

var ribbonBarInside = new WinMenuBar(ribbonBar); 
ribbonBarInside.SearchProperties.Add(WinWindow.PropertyNames.Name, "radRibbonBar"); //Name not ControlName!! 
Assert.IsTrue(ribbonBarInside.TryFind()); 

var tabs = new WinTabPage(ribbonBarInside); 
var tab = tabs.FindMatchingControls().Where(t => (t as WinTabPage).AccessibleDescription.Trim() == "File").FirstOrDefault(); 
Assert.IsNotNull(tab); 
Mouse.Click(tab); 

var buttons = new WinButton(ribbonBarInside); 
var button = buttons.FindMatchingControls().Where(t => (t as WinButton).AccessibleDescription.Trim() == "Open").FirstOrDefault(); 
Assert.IsNotNull(button); 
//Mouse.Click(button); <-- this throw an Exception, next 2 lines solve this. 
Mouse.Location = new Point(button.Left + button.Width/2, button.Top + button.Height/2); 
Mouse.Click(); 
0

Si l'on suppose que la réponse de Pal Bognar est correct, je recommande de créer votre propre type réutilisable pour cette situation. Voici un exemple. Il serait simple de rendre ceci plus générique et d'avoir des sous-classes avec les boutons réels et les onglets de menu disponibles dans chaque instance.

public class WinRibbon : WinControl 
{ 
    protected WinMenuBar RibbonBarInside { 
     get 
     { 
      var ribbonBarInside = new WinMenuBar(this.RibbonBar); 
      ribbonBarInside.SearchConfigurations.Add(WinControl.PropertyNames.Name, "radRibbonBar"); 
      return ribbonBarInside; 
     } 
    } 

    public IEnumerable<WinTabPage> Tabs => new WinTabPage(this.RibbonBarInside).FindMatchingControls().OfType<WinTabPage>(); 

    public WinControl FileTab => this.Tabs.FirstOrDefault(t => t.AccessibleDescription.Trim() == "File"); 

    public IEnumerable<WinButton> Buttons => new WinButton(this.RibbonBarInside).FindMatchingControls().OfType<WinButton>(); 

    public WinButton OpenButton => this.Buttons.FirstOrDefault(t => t.AccessibleDescription.Trim() == "Open"); 

    public WinRibbon(UITestControl parent = null) : base(parent) 
    { 
     this.SearchProperties.Add(WinControl.PropertyNames.ControlName, "radRibbonBar"); 
    } 

    public void ClickOpenButton() 
    { 
     var openButton = this.OpenButton; // to prevent creating a new one each time 
     Mouse.Location = new Point(openButton.Left + openButton.Width/2, openButton.Top + openButton.Height/2); 
     Mouse.Click(); 
    } 
}