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

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

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

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

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

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

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

Появилась опять проблема по теме. Выполняю проверку кнопки isEnabled() через дебаг:


аттрибут disabled присутствует, но в лог выводит совершенно другое:


Вроде обращаюсь к элементу правильно. В чем может быть проблема? Спасибо.

И имеет на это полное право - атрибут disabled невалидный для тэга div, и никоим образом не лишает его “кликабельности”.

1 лайк

Тогда каким образом можно выполнить проверку на кликабельность элемента?

Такой способ будет “легален”?:

public void waitEnableButton(WebElement element){			
			for(int i = 0; i<10; i++){
				String atr = element.getAttribute("disabled");
				if(!(atr==null)){
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}					
				}
				else{
					break;
				}			
		}
	}

Чего вы так прицепились к этому атрибуту? Может его UI-щики используют для своих экзотических целей. В Selenium уже вшит встроенный expected condition для проверки элемента на кликабельность. Да и что за велосипеды с циклами и слипами? Как же WebDriverWait?

1 лайк

Не работает expected condition для Div, кликает кнопку даже если она не активна, просто так бы не спросил.

На скрине у вас кнопка активна, но атрибут disabled. Вы проверяете isEnabled() на активной кнопке, что возвращает true, что логично. Кидайте скрин верстки c открытым style и неактивной кнопкой, ибо пока я не вижу, чтобы были соблюдены все условия для ответа на ваш вопрос.

Надеюсь это то, что вы попросили:

На скрине кнопки активны или задизейблены? Как у вас вообще визуально отличаются активные и задизейбленные кнопки между собой? И поставьте Firebug / Firepath. Хотелось бы увидеть результаты поиска по вашему локатору с подсвеченным элементом в верстке, дабы отбросить все сомнения.

П.С. И вообще странно то, что у выделенного элемента display : none стоит.

Различие видно визуально. Пример привел на скринах ниже с подсветкой локатора.

Кнопки активны:

Кнопки не активны:

Интереса ради, что вам выдаст FirePath на CSS .btn[disabled] для активных и неактивных кнопок?

Не активные кнопки:

Активные кнопки:

P.S. теперь вы понимаете почему я “мусолю” эту тему?

Ну так все верно. Если кнопки активны, поиск по .btn[disabled] ничего не даст. Если сделать более точный поиск, к примеру, по .buttonbar-container.btn[disabled], то, наверняка вы получите всего 3 нода - целевые кнопки. Если вы 100% уверены, что изначально они у вас disabled, то почему бы не использовать invisibilityOfElementLocated, чтобы подождать, пока элемент не исчезнет из DOM? Ну технически кнопки то не исчезнут, просто condition вернет true, если findElement бросит эксепшен.

Я предполагал что можно было использовать этот метод, а разве invisibilityOfElementLocated проверит все локаторы на наличие disabled, а не только первый по списку?

Это уже нюансы. Вы можете применить это условие только к одной, нужной вам, кнопке. Кликать то вы будете не по всем сразу. Так что локатор уж сами подбирайте. Суть была как раз в выборе подходящего wait condition.

просто все равно придется на каждую кнопку делать отдельную проверку (они же все потом будут использоваться в дальнейшем), да и выглядеть это будет “копипастом”. Спасибо за совет (P.S. буду благодарен если ответите в теме на мое сообщение).