2016-11-29 4 views
0

Я работаю на автоматизированный тест, и я могу получить список элементов, которые мне нужно на странице, используя следующее:Есть ли способ ограничить размер списка элементов в объекте страницы?

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); 
     } 
    } 
} 

Это получает список из 166 элементов, хотя и занимает некоторое время, чтобы найти их всех и выберите один из списка, чтобы щелкнуть. Вот пример теста:

[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(); 

    //... 
} 

мне интересно, если есть способ ограничить размер списка инициализируется в Пажеском Object, потому что мне нужно только около 30 из этих элементов, и было бы значительно ускорить тест. Я попытался инициализировать список с помощью ключевого слова new непосредственно в конструкторе объекта страницы с определенной емкостью перед вызовом PageFactory.InitElements(...), но кажется, что новый список создается каждый раз, когда драйвер ищет элементы, поэтому это не влияет.

Любые предложения или это даже возможно?

Редактировать: Это приложение для телефона iOS, и в конце концов мы хотим, чтобы в начале нашего тестового прогона можно было выбрать язык наугад.

+0

Прежде чем мы перейдем к вопросу, который вы задали, возникает проблема (если я не ошибаюсь) 166 дубликатов идентификаторов на вашей странице. Если это правда, вам нужно поговорить с разработчиками. http://softwareengineering.stackexchange.com/questions/127178/two-html-elements-with-same-id-attribute-how-bad-is-it-really – jibbs

+0

Добавить [CacheLookup] после FindBys. Это будет кэшировать результаты, а не искать элементы снова. Если у вас есть какой-то вызов ajax на этот элемент, вы можете столкнуться с проблемами с кешированием. Если вам нужен уменьшенный набор результатов, вам нужно будет точно настроить свою стратегию локатора или заставить своих разработчиков добавлять уникальные идентификаторы, как было предложено выше. Просто идея, возможно, использует локатор xpath и ищет текст кнопки, который начинается с определенного набора алфавитов, например a, b, c, d ... – Grasshopper

+0

@jibbs Это то, что я на самом деле попросил их сделать так, чтобы я мог получить весь список элементов меню, используя один идентификатор в моем объекте страницы. – Blink

ответ

2

Кажется, вас интересует только второй элемент. Предлагаю создать следующее свойство:

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

«: п-го из-типа» представляет собой селектор CSS, чтобы получить элемент в коллекции по его индексу.

В качестве альтернативы, вы можете создать метод, чтобы получить элемент по его индексу:

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

* Примечание: Я использовал класс вместо идентификатора, потому что это не имеет смысла иметь несколько элементов с одинаковыми идентификаторами ,

+0

Я использую функцию «automationName» XCUITest для поддержки 10.1+. Автоматизация и селектор CSS в настоящее время не поддерживаются этим. Должен ли я попробовать подобный подход с помощью XPath? – Blink

+0

Я реализовал ту же логику, используя XPath, и это сработало. Также намного быстрее, чем раньше. Спасибо! – Blink

Смежные вопросы