Как работает @CacheLookup в WebDriver? - PullRequest
5 голосов
/ 02 июня 2011

Я не уверен, что понимаю принцип кэширования:

@CacheLookup
@FindBy(how = How.ID, using = namespace + signifLvl)
private WebElement sigLvl;

Если мы используем этот способ аннотации, используется ElementLocator и при первом обращении к полю, элемент найден driver.findElement(by) и кэшируется через ElementLocator, так что в следующий раз, когда мы ссылаемся на него, он возвращается из кэша.

Похоже, это зависит от времени жизни экземпляра ElementLocator & PageObject.

Также это не относится к прямым driver.findElement(By); вызовам.

Я предполагаю, что WebElement похож на указатель / ссылку на элемент, верно?Так что если элемент изменяется в браузере, он сразу отражается в WebElement.Как это в JavaScript.Потому что все методы RemoteWebElement относительно состояния элемента выполняют команду / запрос к браузеру.

Чтобы изменения отражались даже в кэшированном элементе, верно?

Ответы [ 3 ]

10 голосов
/ 19 июня 2014

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

Что теперь делает cachelookup , так это то, что он сохраняет элементы, к которым применена аннотация @cachelookup, а затем сохраняет этот элемент для дальнейшего использования. Например :

  public class SearchPage {
 // The element is now looked up using the name attribute,
  // and we never look it up once it has been used the first time
  @FindBy(how = How.NAME, using = "q")
  @CacheLookup
  private WebElement searchBox;
  public void searchFor(String text) {
  // We continue using the element just as before
   searchBox.sendKeys(text);
  searchBox.submit();
   } }

Что делает эта аннотация, так это то, что она хранит значение элемента searchBox, и теперь нет необходимости снова искать этот элемент на веб-странице.

3 голосов
/ 14 июня 2011

Имхо вопрос должен быть: что такое указатель / идентификатор элемента?

Поскольку WebElement не имеет состояния, только методы, вызывающие браузер.@CacheLookup - это всего лишь ярлык для public WebElement el = driver.findElement(By);, например, при инициализации PageObject WebDriver.

После того, как у вас есть экземпляр, вы выполняете его методы, которые вызывают браузер.

Идентификатор WebElement соответствует экземпляру элемента JS.если вы идете так на клиентском JS:

var node1 = document.createElement('a');

, а затем добавляете его куда-то, удаляете оттуда, добавляете его в другом месте и т. д., и это все тот же экземпляр node1, экземпляр WebElement по-прежнемууказывает на элемент node1, потому что это тот же экземпляр узла JS.

1 голос
/ 12 ноября 2017

Я знаю, что этот ответ опоздал на вечеринку.Я пытался понять @Cachelookup сам и придумал определенные тесты и выводы.Эту тему сложно объяснить вкратце здесь.Поэтому, пожалуйста, взгляните на статью, которая пытается понять внутреннюю работу @CacheLookup, а также улучшения производительности, которые мы получаем, используя эту аннотацию.Статья на ToolsQA здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...