Лучшим и самым простым решением вашей проблемы было бы, если бы вы могли дать кнопкам разные имена.
Помните: name
компонента отличается от text
, который он отображает!Все ваши кнопки могли бы показывать «текст» пользователям, но при этом иметь названия вроде «button1», «button2», «button3».
В этом случае вы могли бы написать
frame.button(JButtonMatcher.withName("button1").withText("text").andShowing()).click();
Следующая возможность состоит в том, чтобы дать панелям, содержащим кнопки, разные имена, например, «панель1», «панель2», «панель3».
Если вы можете реализовать это, вы можете написать
frame.panel("panel1").button(JButtonMatcher.withText("text").andShowing()).click();
Последняя и худшая возможность - написать собственную GenericTypeMatcher
/ NamedComponentMatcherTemplate
, которая возвращает только n
-ую кнопку, соответствующую данному тексту.
ПОЖАЛУЙСТА, ВНИМАНИЕ :
- это отдельная мера, если все другие подходы не пройдут
- Это приведет к хрупким тестам
- Вы не хотите делатьэто если нет абсолютно никакого другого пути!
С этими предупреждениями на месте, это код:
public class MyJButtonMatcher extends NamedComponentMatcherTemplate<JButton> {
private String text;
private int index;
public MyJButtonMatcher(String text, int index) {
super(JButton.class);
this.text = text;
this.index = index;
requireShowing(true);
}
@Override
protected boolean isMatching(JButton button) {
if (isNameMatching(button.getName()) && arePropertyValuesMatching(text, button.getText())) {
return index-- == 0;
} else {
return false;
}
}
}