Selenium Webdriver и PageFactory инициализируют элементы списка

#webdriver #selenium-webdriver

#webdriver #selenium-webdriver

Вопрос:

Я искал документы API Selenium Webdriver, размещенные в Google code. В настоящее время использую PageFactory для инициализации объектов моей страницы, но возникли проблемы с инициализацией списка WebElement.

Что мне нужно, так это способ инициализации списка элементов, в идеале списка выпадающих списков выбора.

Я просмотрел ссылки API на @Findsby и @ByChained, но все еще не могу найти наилучший способ инициализации списка выпадающих полей выбора. У меня МОГ бы быть отдельный WebElement для каждого из них и захватить идентификатор, но я хотел бы инициализировать список выбранных списков

В настоящее время я использую следующее:

 public class PageObject {

        @FindBy(id="element_id")
        private WebElement element;

        public getElement() {
          return element;
        }
}
  

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

 public class PageObject {   

    @FindBys(className="selectItmes")
    private List<WebElement> selects;

    public List<WebElement> getSelects() {
      return selects;
    }  
}
  

Или я должен использовать один веб-элемент для каждого элемента? 🙁

Обновить

Кто-нибудь знает, как использовать PageFactory и инициализировать элементы списка; используя аннотацию FindsBy . Я не могу найти какой-либо способ сделать это, но на сайте selenium google docs есть проблемы с Google, в которых говорится, что это было исправлено в привязках Java api и в версии 2.12, поскольку оно было ошибочно отключено в 2.11…. Я все еще не могу инициализировать список. =/

Ответ №1:

Эта функция была недавно добавлена в Selenium 2.0. Проверьте эту проблему. Теперь это исправлено.

Из документов вы могли бы сделать что-то вроде,

 @FindAllBy(className="selectItmes") 
List<WebElement> selects;
  

Если вас интересует код, проверьте это

Комментарии:

1. оказывается, он был удален из выпуска, поскольку вызывал другие проблемы. ссылка : ( Неприятно, поскольку я обновил свой pom-файл текущей версией selenium из репозитория maven, которая является выпуском 2.11

2. На этой неделе выйдет новый релиз. Следите за обновлениями!

3. Я использую новейшие файлы библиотеки для привязок Selenium Webdriver .Net, но по-прежнему невозможно использовать [findBy(Как = Как. Идентификатор, используя = «id»)] общедоступный список элементов <IWebElement> { get; set; } Я получаю следующую ошибку: Сообщение: Система. Исключение ArgumentException : объект типа ‘Castle. Прокси. ‘IWrapsElementProxy_1’ не может быть преобразован в тип ‘System. Коллекции. Generic.List`1[openQA.Selenium. IWebElement]’.

4. @PatrickMagee Похоже, что вы используете findBy, вы пробовали @findAllBy?

5. Каков статус этого? В Selenium 2.25.0 нет этого класса.

Ответ №2:

Вот стандартное решение, которое я делаю в нашей тестовой среде, пока @findAllBy не начнет работать в библиотеке Selenium:

 private List<WebElement> selects;

public List<WebElement> getSelects() {
      selects = getDriver().findElements(By.xpath("..."));
      return selects;
    } 
  

Ответ №3:

Вы можете довольно легко найти параметры выбора, все, что вам нужно сделать, это использовать Webdriver .Поддержка ссылки на dll. Это дает вам доступ к классу SelectElement . Вот краткий пример:

 IWebElement element = driver.FindElement(By.TagName("select"));

SelectElement select = new SelectElement(element);
int options = element.FindElements(By.TagName("option")).Count();
select.SelectByIndex(new Random().Next(1, options - 1));
  

Приведенный выше код находит элемент select, получает количество опций в этом элементе select и затем выбирает один наугад.

Код может немного отличаться, потому что мой код написан на C#

Ответ №4:

       @FindBys(@FindBy(xpath="//span[@class='ng-binding']"))

        private List<WebElement> AllData;

        public List<WebElement> getAllData() {
            return AllData;
        }
  

Ответ №5:

Я решаю эту проблему следующим образом:

 @FindBy(id="element_id")
public List<WebElement> selects;
  

Теперь у вас есть список всех веб-элементов с этим идентификатором.

Затем вы просто извлекаете элемент из списка, как и любой другой список веб-элементов PageFactory.

Ответ №6:

Я знаю, что это старый, но потерял много времени из-за подобной проблемы. С моей стороны проблема заключалась в том, что я никогда не инициализировал список. Так что это не сработало:

     @FindBy(css = .randomlocator)
    private List<WebElement> list;
  

но это сработало:

     @FindBy(css = .randomlocator)
    private List<WebElement> list= new ArrayList<>();
  

Может быть, это кому-то поможет.