Перебрать все элементы xpath, используя @Findby в java

Я начал использовать фабрику страниц, и теперь мне нужно указать xpath в @FindBy. Было бы здорово, если бы кто-то мог предоставить какое-либо предложение или ссылку о том, как передать переменную в xpath с помощью @Findby.

Элемент, который я хочу заменить аннотацией @Findby

for(i=1; i <= liElements.size(); i++) {
   WebElement linkElement = driver.findElement(By.xpath("//li[" + i + "]/div//a[contains(@class, 'btn-mini')]"));
   linkElement.click(); 
}

Заранее большое спасибо за вашу помощь.


person user16165    schedule 04.11.2016    source источник
comment
Из вашего поста не выделяется основная проблема. Не могли бы вы уточнить, заметили ли вы какую-либо ошибку или образец html, который вы пытаетесь найти?   -  person Rao    schedule 04.11.2016
comment
Я хочу заменить свой код аннотацией @FindBy. Я не уверен, как я могу этого достичь.   -  person user16165    schedule 04.11.2016
comment
Не могли бы вы проверить образец здесь и посмотреть, полезен ли он?   -  person Rao    schedule 04.11.2016
comment
Возможный дубликат Что такое использование аннотации @FindBy?   -  person Markus    schedule 04.11.2016
comment
Простой ответ Нет. Вы не можете этого сделать. Причина: ваша карта webelements-locator инициализируется при вызове PageFactory.initElements, вам придется делать повторные вызовы к ней, кроме того, аннотация — это метаданные, которые фиксируются во время самой загрузки класса. единственный способ измениться - через размышления, и я сомневаюсь, что стоит вообще идти по пути отражения. Это ненужная боль, которую вам придется терпеть, я бы порекомендовал сделать ее простой, поскольку она уже есть.   -  person Mrunal Gosar    schedule 04.11.2016
comment
О, это плохо. Но тогда рекомендуется ли использовать аннотацию @Findby для всех остальных элементов страницы и использовать driver.findElement только для одного элемента?   -  person user16165    schedule 04.11.2016
comment
Я бы избегал использования PageFactory, если у вас нет очень статических страниц. PageFactory очищает всю страницу при ее загрузке. Если что-то изменится на странице или у вас есть динамически загружаемая страница, вам все равно придется заново очищать страницу каждый раз, когда она изменяется. Переключайтесь на парсинг только тогда, когда это необходимо, и я думаю, что все становится намного проще.   -  person JeffC    schedule 04.11.2016


Ответы (1)


Что касается вашего вопроса о параметризованном FindBy - это невозможно, поскольку аннотации являются постоянными значениями. Взгляните сюда - Можно ли определить переменные аннотаций во время выполнения?

В этом конкретном случае вы можете найти список элементов в FindBy:

@FindBy(xpath = "//li/div//a[contains(@class, 'btn-mini')]")
private List<WebElement> links;

Затем вы можете перебирать их следующим образом:

for(WebElement link : links) {
    link.click(); 
}

Таким образом, вы будете щелкать ссылки, найденные этим xPath, одну за другой.

person Ievgen    schedule 04.11.2016
comment
Удивительно, большое спасибо. Я как раз искал это :-) Я использую этот код и сообщу вам результат. - person user16165; 04.11.2016
comment
Похоже, @FindBy(xpath = "//li/div//a[contains(@class, 'btn-mini')]") нужно заменить на @FindBy(xpath = "//li/div/a[contains(@class, 'btn-mini')]")? Пожалуйста, перепроверьте. - person Rao; 04.11.2016
comment
@Rao, это зависит только от структуры html, которая находится за кулисами. Однако 1-й вариант более общий. Но зато может найти элементы, которые не нужны топикстартеру. - person Ievgen; 04.11.2016