Как работает @CacheLookup в WebDriver?

#java #caching #webdriver #selenium-webdriver

#java #кэширование #webdriver #selenium-webdriver

Вопрос:

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

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

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

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

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

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

Так что изменения отражаются даже в кэшированном элементе, верно?

Ответ №1:

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, и теперь нет необходимости снова искать этот элемент на веб-странице.

Ответ №2:

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

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

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

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

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

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

Ответ №3:

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