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

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


(Alex) #1

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


(Artur Korobeynyk) #2

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


(vmaximv) #3

Да ну (:

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

(Alex) #4

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


(Artur Korobeynyk) #5

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


(Artur Korobeynyk) #6

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


(Alex) #7

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

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


(sidelnikovmike) #8

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


(Artur Korobeynyk) #9

спасибо


(Alex) #10

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


(Александр Таранков) #11

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


(vmaximv) #12

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


(Artur Korobeynyk) #13

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

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

<input ... disabled> .

Ошибался я.


(vmaximv) #14

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


(Stan) #15

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

if ("disabled".equals(lowerName)) {
  return trueOrNull(! isEnabled());
}

(Maks Kharchenko) #16

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

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

(cactus) #17

лучше так:

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

(gausner) #18

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

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;
}

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


(vmaximv) #19

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


(gausner) #20

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

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