Я проверяю присутствие элемента вот так:
public boolean doesElementExist(WebDriver driver, By elem) {
if (driver.findElements(elem).size() > 0) {
return true;
} else {
return false;
}
}
Я проверяю присутствие элемента вот так:
public boolean doesElementExist(WebDriver driver, By elem) {
if (driver.findElements(elem).size() > 0) {
return true;
} else {
return false;
}
}
лучше так:
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
невалидный для тэга div
, и никоим образом не лишает его “кликабельности”.
Тогда каким образом можно выполнить проверку на кликабельность элемента?
Такой способ будет “легален”?:
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?
Не работает 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. буду благодарен если ответите в теме на мое сообщение).