Как дождаться, пока элемент будет содержать определенный атрибут через Selenium и WebDriverWait?

У меня есть вопрос о селене, если кто-то может помочь. Мне нужно попасть на страницу URL, где изначально узел на этой странице находится в статусе «зарегистрирован», а через X секунд его статус будет динамически изменен на статус «готов». И пока его статус не перейдет в статус «готов», я могу продолжить следующие шаги во время выполнения селена. Вот html-код исходного кода,

<div class="icon-holder pull-left" action = "select-device" sn="FX0071234" status = "in_stock">
   <i class = "...">...</i>
   <div class="model-holder">
       <span class="model-registered">200K</span>
   </div>
   <div class="active-holder">...</div>
</div>

А вот обновленный html-код через X секунд,

<div class="icon-holder pull-left" action = "select-device" sn="FX0071234" status = "discovered">
   <i class = "...">...</i>
   <div class="model-holder">
       <span class="model-ready">200K</span>
   </div>
   <div class="active-holder">...</div>
</div>

Я хочу создать новый объект WebDriverWait (), чтобы дождаться изменения. Вот мой код:

new WebDriverWait(driver, 50).until(ExpectedConditions.attributeContains(
                By.xpath("//span[@class = 'model-registered' and text() = '200K']"), "class", "model-ready"));

Но во время моей работы с селеном этот фрагмент кода никогда не работает, он существует мгновенно. Есть идеи, что может быть не так? Заранее спасибо.


person user3595231    schedule 10.07.2018    source источник


Ответы (4)


Чтобы дождаться перехода элемента в состояние готов, вам нужно вызвать WebDriverWait, и вы можете использовать следующее решение:

boolean status = new WebDriverWait(driver, 20).until(ExpectedConditions.attributeContains(By.xpath("//div[@class='model-holder']/span[contains(.,'200K')]"), "class", "model-ready"));
person DebanjanB    schedule 10.07.2018
comment
Это лучшее решение по сравнению с моим оригинальным. Думаю, мой сценарий сбивает с толку. - person user3595231; 11.07.2018
comment
@ user3595231 Рад, что смог вам помочь !!! Проголосуйте за ответ, если этот / любой ответ / был / был / полезен вам для пользы будущих читателей. - person DebanjanB; 11.07.2018

Вы можете непосредственно дождаться существования элемента с классом «готово к модели». Вот код:

new WebDriverWait(driver, 50).until(ExpectedConditions.ElementExists(
            By.xpath("//span[@class = 'model-ready' and text() = '200K']")));

Сообщите мне, если это не сработает.

person Raj    schedule 10.07.2018

Используйте FluentWait, чтобы подождать, пока статус не изменится на «Готово».

 Wait<WebDriver> wait = new FluentWait<WebDriver>(webDriver)
.withTimeout(30, TimeUnit.SECONDS) // set the timeout
.pollingEvery(2, TimeUnit.SECONDS); // set the interval. Checks every 2sec's for the element status 'ready'

WebElement foo = wait.until(new Function() { 
public WebElement apply(WebDriver driver) { 
return driver.findElement(By.xpath("//span[@class = 'model-ready' and text() = '200K']")); 
} 
});
person Magesh    schedule 10.07.2018

Вы также можете использовать метод waitForAttributeMatchesRegex для ожидания атрибута таргетинга, пока он не совпадет с каким-либо конкретным шаблоном.

Примерно так: webElement.waitForAttributeMatchesRegex(attribute, regex);

person Zzz...    schedule 24.02.2020