Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Thucydides: Как получить доступ к локатору, указанному в @FindBy


(Zvonov) #1

Допустим, нам нужно использовать информацию о некотором контроле в нескольких местах. Напирмер в waitForRenderedElements.

Можно-ли как-то достучаться к значению @FindBy элемента?

 


(Mykhailo Poliarush) #2

нет нельзя, по крайней мере, когда я иследовал этот вопрос

(может быть что-то поменялось, если у кого-то есть решение, буду рад посмотреть)

часто вот именно по этим соображениями некоторые хранят локаторы в виде

By locator = By.id("some_locator")

потому, что его потом удобно передаь куда тебе необходимо


(Taras) #3

да, я тоже стикался с етим....не получилось


(Zvonov) #4

@Polusik, а разве FindBy может принимать переменные типа By ?


(mikhail.sidelnikov) #5

 

Не знаю, можно ли как то через стандартные методы вебдрайвера и вебелемента, можно через reflection.

Очень грубый пример,но если очень нужно достать, то можно  как то так:

 

 

public class TestFind {
 
    @FindBy(id = "aaaa")
    static WebElement test;
 
    public static void main(String[] args) {
        try {
            Class clazz = TestFind.class;
            Field field = clazz.getDeclaredField("test");
            FindBy annotation = field.getAnnotation(FindBy.class);
            System.out.println(annotation.id());
        } catch (NoSuchFieldException e) {
            e.printStackTrace(); 
        }
    }
}
 
 
можно сделать отдельный метод с нужными параметрами, например как то так:
public static String getIdValueOfAnnotation(String fieldName, Class class), тогда пример будет выглядеть примерно так:
 
public class TestFind {
 
    @FindBy(id = "aaaa")
    private WebElement test;
 
    public static void main(String[] args) {
        try {
            System.out.println(getIdValueOfAnnotation("test", TestFind.class));
        } catch (NoSuchFieldException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
 
    public static String getIdValueOfAnnotation(String paramName, Class clazz) throws NoSuchFieldException {
        Field field = clazz.getDeclaredField(paramName);
        FindBy annotation = field.getAnnotation(FindBy.class);
        return annotation.id();
    }
}
 
 
Считываться будут так же private поля других классов. Так же , разумеется, можно считывать другие значения из findBy.
Вообщем можно развлекаться :)

 


(mikhail.sidelnikov) #6

Сорри, невнимателен. Не заметил thusidides. А так - для джавы подходит))


(Sergey Korol) #7

By - это альтернатива связке @FindBy + WebElement, которая позволяет более гибко управлять локаторами.


(Mykhailo Poliarush) #8

нет, 

т.е. удаляешь FindBy и пользуешься By


(Mykhailo Poliarush) #9

да можно и через интроспекцию сделать, вариант должен нормально работать

спасибо за пример