2016-11-29 1 views
0

Ich arbeite an einem automatisierten Test und ich bin in der Lage, eine Liste von Elementen zu erhalten, die ich auf einer Seite muß mit dem folgenden:Gibt es eine Möglichkeit, die Größe einer Elementliste in einem Page Object zu begrenzen?

using System.Collections.Generic; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Support.PageObjects; 

namespace iOSAutomation.PageObjects 
{ 
    public class CCLMenu 
    { 
     private IWebDriver driver; 

     // Menu element buttons 
     [FindsBy(How = How.Id, Using = "btn_MenuElement")] 
     public IList<IWebElement> menuElement_buttons; 


     // Constructor 
     public CCLMenu(IWebDriver driver) 
     { 
      this.driver = driver; 
      PageFactory.InitElements(driver, this); 
     } 
    } 
} 

Dies wird eine Liste der 166 Elemente obwohl und dauert eine Weile zu finden Sie alle und wählen Sie einen aus der Liste aus, um zu klicken. Hier ist ein Beispiel des Tests:

[TestMethod] 
public void SelectCCLOptions() 
{ 
    //... 

    // THIS CURRENTLY GETS A LIST OF 166 ELEMENTS; TODO - Find a way to limit list size 
    Debug.WriteLine("Array count: " + cclMenu.menuElement_buttons.Count); 
    Assert.IsTrue(isElementPresent(driver, cclMenu.menuElement_buttons.ElementAt(1), 60), "Unable to find country menu element button on " + cclMenu.ToString()); 
    cclMenu.menuElement_buttons.ElementAt(1).Click(); 

    //... 
} 

Ich frage mich, ob es einen Weg gibt, um die Größe der Liste in der Seite Objekt initialisiert zu begrenzen, weil ich nur etwa 30 dieser Elemente müssen und es würde erheblich beschleunigen der Test. Ich habe versucht, die Liste mit dem new Schlüsselwort direkt im Konstruktor des Seiten-Objekts mit einer spezifischen Kapazität vor Aufruf PageFactory.InitElements(...) zu initialisieren, aber es scheint, dass eine neue Liste jedes Mal instanziiert wird, wenn der Fahrer nach den Elementen sucht, also hat das keine Auswirkung.

Irgendwelche Vorschläge oder ist das überhaupt möglich?

Bearbeiten: Dies ist für eine iOS-Telefon-Anwendung und wir möchten schließlich in der Lage sein, eine Sprache zu Beginn unseres Testlaufs zufällig auszuwählen.

+0

Bevor wir zu der Frage kommen, die Sie gestellt haben, gibt es das Problem (wenn ich nicht falsch verstanden habe) 166 doppelte IDs auf Ihrer Seite. Wenn das stimmt, müssen Sie sich mit Ihren Entwicklern unterhalten. http://softwareengineering.stackexchange.com/questions/127178/two-html-elements-with-same-id-attribute-how-bad-is-it-really – jibbs

+0

[CacheLookup] nach den FindBys anhängen. Dadurch werden die Ergebnisse zwischengespeichert und nicht erneut nach Elementen gesucht. Wenn Sie ein paar Off-Ajax-Aufrufe für dieses Element haben, könnten Probleme mit dem Caching auftreten. Wenn Sie eine reduzierte Anzahl von Ergebnissen wünschen, müssen Sie Ihre Locator-Strategie verfeinern oder Ihre Entwickler dazu bringen, wie oben vorgeschlagen, eindeutige IDs hinzuzufügen. Nur eine Idee, vielleicht einen XPath-Locator verwenden und nach Button-Text suchen, der mit einem bestimmten Satz von Alphabeten beginnt, zB a, b, c, d ... – Grasshopper

+0

@jibbs Das ist etwas, was ich eigentlich von ihnen verlangte, damit ich es schaffen konnte die gesamte Liste der Menüelemente mit einer einzigen ID in meinem Seitenobjekt. – Blink

Antwort

2

Es scheint, als ob Sie nur an dem zweiten Element interessiert sind. Ich schlage vor, die Schaffung der folgenden Eigenschaft:

public IWebElement CountryMenu { 
    get { 
     return driver.FindElement(By.CssSelector(".btn_MenuElement:nth-of-type(1)")); 
    } 
} 

„: n-of-Typ“ ist ein CSS-Selektor ein Element in einer Sammlung durch seinen Index zu erhalten.

Alternativ könnten Sie eine Methode erstellen Sie ein Element durch seinen Index abzurufen:

public IWebElement GetMenu(int index) { 
    return driver.FindElement(By.CssSelector(
     string.Format(".btn_MenuElement:nth-of-type({0})", index) 
    )); 
} 

* Anmerkung: benutzte ich Klasse statt id, weil es keinen Sinn macht, mehrere Elemente mit der gleichen ID haben .

+0

Ich benutze die XCUITest-Funktion 'automationName', um 10.1+ Automatisierung zu unterstützen, und CSS-Selektoren werden derzeit nicht unterstützt. Sollte ich einen ähnlichen Ansatz mit einem XPath versuchen? – Blink

+0

Ich implementierte die gleiche Logik mit einem XPath und es funktionierte. Auch viel schneller als vorher. Vielen Dank! – Blink

Verwandte Themen