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

Проясните робту метода isDispaly() и явное ожидание и ерор который вылетает


#1

Добрый день
Решил поэкспериментировать
К примеру пишу собственный метод
в метод передаю драйвер и локатор ок ??

public WebElement customWait(WebDriver  driver, By by){
count++;
try{
//ждем 10 секунд появления элемента периодически просыпаясь и смотря а есть ли элемент ок ???  
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
 FluentWait  wait = new FluentWait(driver).withTimeout(10,TimeUnit.SECONDS).pollingEvery(200,TimeUnit.MILLISECONDS).ignoring(NoSuchElementException.class);
element = (WebElement)wait.until(ExpectedConditions.visibilityOfElementLocated(by));

if( element.isDisplayed()){
  
  return element;
 }

}
catch{ StaleElementReferenceException except){
// типа рекурсия 
if (count<2) {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    customWaitBy(driver, by);
}
return null;
}

так вот вопрос вылетает периодически selenium.StaleElementReferenceException?? откуда ?? я же ловлю его
далее по все видимости isDispaly() может быть false при этом until(ExpectedConditions.visibilityOfElementLocated(by)) будет выполнятся это условие то есть visibilityOfElementLocated(By locator) — ожидание появления элемента в DOM и его видимости
как так то ??


(rmerkushin) #2

Меня смущает это: element = (WebElement)wait.until(ExpectedConditions.visibilityOfElementLocated(by));
Что вернет метод в случае если элемент не появится? Null? В таком случае element.isDisplayed() кинет ексепшн. Еще как вариант может меняться сам элемент по ходу выполнения кода, тобишь на странице изменений нет, xpath остался тот же, но изменился внутренний id в dom. В таком случае повторное обращение к уже ранее найденному элементу кинет эксепшн.

P.S.: пример ожидания исчезновения элемента со страницы, правда для Python :smile: :

wait = WebDriverWait(self.driver, timeout=int(timeout))
message = "Element '%s' was not hidden in %s second(s)." % (xpath, str(timeout))
wait.until_not(lambda driver: driver.find_element_by_xpath(xpath).is_displayed(), message=message)

#3

окей пусть бросает ексепшн я его ловлю и делаю ретурн и пускай будет нулпоинтер ексепшн но летит то StaleElementReferenceException откуда ??