Перейти к содержимому

Публикации FibYar

3 публикаций создано FibYar (учитываются публикации только с 25 апреля 2023)


#159799 PageFactory, DefaultFieldDecorator и CacheLookup

Отправлено автор: FibYar 22 апреля 2017 - 16:13 в Selenium - Functional Testing

Выше глупость написал. Конечно, статический метод не будет сбрасывать кэши в отдельных локаторах.

Не знаю, относится ли этот комментарий ко всему ответу или только части, но за ответ спасибо. Как я понял, придётся сильно менять реализацию всего. Буду пробовать.




#159765 PageFactory, DefaultFieldDecorator и CacheLookup

Отправлено автор: FibYar 19 апреля 2017 - 17:39 в Selenium - Functional Testing

1)у тебя все как-то архисложно. DefaultFieldDecorator надо примерно использовать, как описано тут:

http://internetka.in...fielddecorator/

Вот как-то оттуда я всё и почерпнул) А сложно лишь для того, чтобы можно было написать свою аннотацию со своими особыми вариантами поиска.

 

А что кешируется? Свойства элемента, сам WebElement или только локатор?

WebElement кешировать небезопасно, поскольку это лишь некий временный ID, который выдает браузер, и после любого действия на странице он может стать недействительным. Тогда нужно дополнительно писать логику на то, в какой момент этот кэш будет сбрасываться.

Я хочу кешировать вебЭлемент лишь на короткий промежуток кода - когда я подряд провожу над ним несколько действий. Например, как в изначальном сообщении: сначала выполнить clear, затем sendKeys. Или же есть другая ситуация: я получаю свойства какого-то элемента (например, значение определенного атрибута или видимость элемента) и, в зависимости от него, делаю определенные действия уже над другим элементом. При этом результат записываю в переменную. И ещё результат переменной отписываю в лог. Самое главное - при каждом этом действии вызывается поиск элемента (а хочется лишь один раз - при присвоении переменной (а не при каждом считывании её значения)):

Boolean enabled = webElement.isEnabled(); //Поиск происходит здесь (запись значения)
logger.debug(enabled);                    //Поиск происходит здесь (а тут не хочу)
if (enabled) {                            //Поиск происходит здесь (и тут не хочу)
   //do something
}



#159758 PageFactory, DefaultFieldDecorator и CacheLookup

Отправлено автор: FibYar 19 апреля 2017 - 14:20 в Selenium - Functional Testing

Добрый день!

У меня возникла такая проблема. Я создал обёртку над шаблоном PageFactory с помощью DefaultFieldDecorator. Теперь использую свои аннотации и способы поиска элементов.

Но у меня возникла проблема с "ленивой инициализацией". Иногда мне бы хотелось закэшировать веб-элементы, свойства которых я получаю, но не знаю как. Аннотация @CacheLookup не работает после "расширения" PageFactory с помощью DefaultFieldDecorator. Да и хотелось бы не "всегда кэшировать отдельный элемент", а "на время включать кэширование, а затем (после получения нескольких свойств) отключать".

Кусок кода, где поиск происходит дважды:

webElement.clear();
webElement.click();

Переопределение делаю как-то так (сам понимаю с трудом, так как делал года три назад):

public class MyFieldDecorator extends DefaultFieldDecorator {

    public MyFieldDecorator(ElementLocatorFactory factory) {
        super(factory);
    }
public class MyElementLocator implements ElementLocator {
private final SearchContext searchContext;
private final By by;
public MyElementLocator(SearchContext searchContext, Field field) {
this.searchContext = searchContext;
MyAnnotations annotations = new MyAnnotations(field);
by = annotations.buildFirstBy();
}
public final class MyElementLocatorFactory implements ElementLocatorFactory, SearchContext {
PageFactory.initElements(new MyFieldDecorator(new MyElementLocatorFactory(driver)), webPage);

Надеюсь, что удалось объяснить, что я хочу :)