Проверка (isEnabled) не срабатывает

Есть на форме кнопка которая становится доступной для нажатия, только после того как заполнишь обязательные поля. Решил сделать ожидание используя условие с “isEnabled”, но WebDriver думает что кнопка все равно доступна и нажимает на нее. В результате тест фейлится. Что делать в такой ситуации?

проверять аттрибут disabled == “disabled”, так как кто-то криво сделал ваш сайт. disabled должно быть true или false согласно DOM, но у ваших разработчиков своё собственное мнение

Да ну (:

Code:

WebDriver driver = new FirefoxDriver();
driver.get("http://jsfiddle.net/v3o4bxgd/");
driver.switchTo().frame("result");
System.out.println("Attribute 'disabled':"+driver.findElement(By.tagName("button")).getAttribute("disabled"));
System.out.println("WebElement.IsEnabled():"+driver.findElement(By.tagName("button")).isEnabled());

Output:

Attribute 'disabled':true
WebElement.IsEnabled():false

Тогда что в моем случае делать? Собственную проверку создавать?

И в чем я был неправ?

driver.findElement(By.tagName(“button”)).getAttribute(“disabled”) == “disabled”
вот и вся проверка

Цитирую разработчиков “Где сказано что согласно DOM disabled должен отдавать параметр false или true. На любую страницу гугла если зайти написано, что если элемент не доступен то ставится, disabled=‘disabled’, если наоборот то его просто нет”.

Но даже если отбросить все споры, isEnabled для меня не актуально теперь?

Disabled=‘disabled’ вполне нормальная и часто встречающаяся конструкция. По идее селениум должен проверять такое.
arturk у нас просто умнее всех))

спасибо

Проблема была в том, что я использовал “якорь” span? в то время как нужно было использовать button. Если я правильно понял для метода isEnabled() нужно использовать “якорь” который содержит disabled="disabled"

span - это невидимый элемент, по логике WebDriver он в принципе не может быть Enabled

Если бы вы прочитали и разобрали мой пример, то поняли бы - что во всем.

@vmaximv
Если бы вы выложили код страницы, по которому ваш тест работал, то все бы поняли.

А так да, оказывается согласно XHTML disabled должен равняться … чему угодно, главное не быть пустым, тогда он считается disabled. Тоесть, disabled=“disabled”, disabled=1, disabled=“nabrabobra” - это всё правильные записи, которые “правильно” ставят параметр. Значение не важно, важно наличие.
Согласно же HTML5 аттрибут disabled указывается без значения

<input ... disabled> .

Ошибался я.

1 лайк

Урл страницы есть в моем тесте: кому надо, тот открыл ее - посмотрел код и понял.
В ваших же рассуждениях есть одно заблуждение - вы не отличаете attribute от property и не до конца понимаете механику работы WebElement.getAttribute().

Просто ради инфы, специально посмотрел логику IsEnabled, он по сути делает тоже самое, что и проверка на наличие disabled.

if ("disabled".equals(lowerName)) {
  return trueOrNull(! isEnabled());
}
1 лайк

Я проверяю присутствие элемента вот так:

 public boolean doesElementExist(WebDriver driver, By elem) {
	if (driver.findElements(elem).size() > 0) {
		return true;
	} else {
		return false;
	}
}
1 лайк

лучше так:

    public boolean doesElementExist(WebDriver driver, By elem) {
        return !driver.findElements(elem).isEmpty();         
    }

В таком случае возможна очень неприятная задержка, если при инициализации драйвера вы задаете имплицитное ожидание типа

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

Это означает, что если элемента нет на странице, тест будет ждать его появления в течение 30 секунд, прежде чем вернуть результат isEmpty() = false.

Кто как решает эту проблему?

Я делаю что-то типа

public boolean doesElementExist(WebDriver driver, By elem) {
    boolean elementExists = false;
    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
    if (!driver.findElements(elem).isEmpty()){
        elementExists = true;
    }   
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    return elementExists;
}

Что думаете, уместно так делать?

Надеюсь это просто опечатка?

Да, извиняюсь. Я имел в виду “!”

Исправил также в предыдущем сообщении, чтобы не путать людей.
Спасибо за комментарий.