WebDriverWait для изменения атрибута элемента
Как я могу использовать WebDriverWait для ожидания изменения атрибута?
В моем AUT я должен дождаться, когда кнопка станет включенной, прежде чем продолжить, к сожалению, из-за того, как разработчик закодировал страницу, я не могу использовать метод WebElement isEnabled(). Разработчик использует некоторый CSS, чтобы просто заставить кнопку выглядеть так, как будто она отключена, поэтому пользователь не может нажать на нее, и метод isEnabled всегда возвращает true для меня. Поэтому мне нужно получить атрибут "aria-disabled" и проверить, является ли текст "истинным" или "ложным". То, что я делал до сих пор, это цикл for с Thread.sleep, что-то вроде этого:
for(int i=0; i<6; ++i){
WebElement button = driver.findElement(By.xpath("xpath"));
String enabled = button.getText()
if(enabled.equals("true")){ break; }
Thread.sleep(10000);
}
(не обращайте внимания на приведенный выше код, если это неверно, просто псевдо код того, что я делаю)
Я уверен, что есть способ добиться чего-то подобного с помощью WebDriverWait, который является предпочтительным методом, который я просто не могу понять. Это то, чего я пытаюсь достичь, хотя следующее не будет работать:
WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOf(refresh.getText() == "true"));
Очевидно, что это не работает, потому что функция ожидает WebElement not String, но это то, что я пытаюсь оценить. Есть идеи?
Ответы
Ответ 1
Следующие требования могут помочь вам.
В следующем коде мы переопределяем метод apply, включающий условие, которое мы ищем. Итак, пока условие не соответствует действительности, в нашем случае включенное значение неверно, мы переходим в цикл максимум на 10 секунд, опросив каждые 500 мс (это значение по умолчанию), пока метод apply не вернет значение true.
WebDriverWait wait = new WebDriverWait(driver,10);
wait.until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
WebElement button = driver.findElement(By.xpath("xpath"));
String enabled = button.getAttribute("aria-disabled");
if(enabled.equals("true"))
return true;
else
return false;
}
});
Ответ 2
Если кто-то хочет использовать @Sri в качестве метода в оболочке Selenium, вот способ сделать это (спасибо этот ответ btw):
public void waitForAttributeChanged(By locator, String attr, String initialValue) {
WebDriverWait wait = new WebDriverWait(this.driver, 5);
wait.until(new ExpectedCondition<Boolean>() {
private By locator;
private String attr;
private String initialValue;
private ExpectedCondition<Boolean> init( By locator, String attr, String initialValue ) {
this.locator = locator;
this.attr = attr;
this.initialValue = initialValue;
return this;
}
public Boolean apply(WebDriver driver) {
WebElement button = driver.findElement(this.locator);
String enabled = button.getAttribute(this.attr);
if(enabled.equals(this.initialValue))
return false;
else
return true;
}
}.init(locator, attr, initialValue));
}
Ответ 3
Это работало для меня, когда автоматизировалась на довольно медленной странице начальной загрузки, ожидая, что кнопка сортировки вступит в силу.
new WebDriverWait(webDriver, 10)
.until(ExpectedConditions.attributeContains(BUTTON_SORT_ASCENDING_PRICE, "class", "sortButtonActive"));
- "webDriver" - мой текущий экземпляр WebDriver
- "10" - время ожидания
- "BUTTON_SORT_ASCENDING_PRICE" - локатор для элемента
- "class" - атрибут
- "sortButtonActive" - значение класса, которое я ожидаю
Selenium V3.01
Ответ 4
Это также можно сделать, используя простой цикл do-while, System.currentTimeMillis(); метод может использоваться, чтобы избежать бесконечного цикла
long startTime = System.currentTimeMillis();
String disabled;
do{
disabled = element.getAttribute("attributeName").trim();
}while(disabled!="false" && System.currentTimeMillis()-startTime<10000);