#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 находится здесь