Подтвердить что ты не робот

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, но это то, что я пытаюсь оценить. Есть идеи?

4b9b3361

Ответ 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);