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

Проверка отсутствия элемента


(Mykhailo Poliarush) #21

да нету таких методов, во всех случаях у вас будет вываливать ексепшин, потому надо будет его отлавливать 

можно конечно через javascript, но это еще сложнее :)


(Mentas) #22

 

Видимо к моему случаю данный подход не применяется. 
Возможно мысль неверно трактовал свою. Элементы на странице, которые нужно отследить - с разными локаторами.
Если делаю так - if driver.find_element_by_class_name("не существующий локатор").size == 0:

Ошибка: NoSuchElementException: Message: u'Unable to locate element: 

Если делаю так - if driver.find_elements_by_class_name("не существующий локатор").size == 0:

Ошибка:  AttributeError: 'list' object has no attribute 'size'.

 

(Mentas) #23

Ясно :) Спасибо за ответы!


(Mykhailo Poliarush) #24

тогда надо тогда чтобы вы рассказали в конечном итоге, что вы хотите сделать.

может быть тогда, помощь будет более направленей :)


(lokofc) #25

Добрый день! Какое условие можно использовать для проверки отсуствия элемента в условии цикла while?(Java)

Дело в том, что мне нужно повторять какое-либо действие, если элемент не видим, я долго мучался пробовал такие:

while (ExpectedConditions.presenceOfAllElementsLocatedBy(By.cssSelector(".k-item-wrapper"))==null){

}

но такое выражение никогда null не принимает,

     public boolean isElementPresent(By by) {
            try {
              driver.findElement(by);
              return true;
            } catch (NoSuchElementException e) {
              return false;
            }
          }

Это выкидывает исключение, а мне для цикла нужно просто, чтобы выражение давало false и все.


(Shestavin) #26

Замените конструкцию

driver.find_elements_by_class_name("не существующий локатор").size() == 0)

на

len(driver.find_elements_by_class_name("не существующий локатор")) == 0)

(asolntsev) #27

Ваша функция isElementPresent - как раз то, что надо. А что за ошибку она выкидывает? Вообще-то не должна.

А если использовать библиотеку Selenide, то вообще всё просто:

while (!$("#message").isDisplayed()) {

   // do stuff

}

 

А почему вообще тест в цикле делает какие-то вещи? По-моему, нетипичная логика для тест. Тест не должен таким заниматься. Если есть элемент - всё в поряке, если нет - тест падает. Какие ещё циклы?


(lokofc) #28

Мне это нужно для конкретного действия, а имеено - чтобы залогиниться на сайт, есть одна проблема, которая связана неопнятно с чем и  вот ее суть:

1) На главной странице сайта есть только два поля  - логин и пароль и кнопка войти

2) При заполнении полей и нажатии на кнопку иногда сайт затупливает и в адресной строке адрес уже изменился, но загрузки страницы не происходит и это не похоже на лаг сервера, потому-что сервер в этот момент отвечает на другие запросы. Может вебдрайвер тупит, может конкретно хромдрайвер, хрен его знает

С разработчиками на данную тему общался, они естественно сваливают все на сервер и мои утилиты.

 

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

 

 


(Sergey Korol) #29
By waitForMePlease = By.cssSelector(".k-item-wrapper");

...

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); // choose me...

WebDriverWait wait = new WebDriverWait(driver, 10); // ... or me

...

login("uName", "uPass");

...

// if (implicitWaits.equals(sucks)) { use(explicitWaits); }

WebElement ohGodImHere = wait.until(ExpectedConditions.visibilityOfElementLocated(waitForMePlease));

doSmthWithMe(ohGodImHere);


(g0rdan) #30

Как вариант, можно использовать js (jQuery) и делать что-то вроде (c#):

public bool isElementPresent(string locator)
{
    return (bool)jsExec.ExecuteScript("return $('" + locator + "').size() != 0");
}

(stek) #31
 public boolean isElementPresent("mimg") {
            try {
                chromeDriver.findElement(By.className("mimg"));
                return true;
            } catch (NoSuchElementException e) {
                return false;
            }
        }
    assertFalse(isElementPresent("mimg")) 

Подскажите в чем моя ошибка?


(Bohdan B) #32

Для начала замените строки на аргументы функции
public boolean isElementPresent(“mimg”) -> public boolean isElementPresent(mimg)
chromeDriver.findElement(By.className(“mimg”)) -> chromeDriver.findElement(By.className(mimg))


(Inna) #33

Я работаю по Page Object и в ходе разработки тестов нужно реализовывать методы , которые являются универсальными для всех локаторов…
Делюсь с вами своей реализацией . В зависимости от того,какой локатор использую - такой метод и вызываю и передаю в него просто String-локатор.
JAVA пример :

private void assertElementNotPresentBase(By element) throws IllegalArgumentException {
    java.util.List<WebElement> sizeElement = driver.findElements(element);
    if (sizeElement.size() == 0) {
        System.out.println("Element not displayed");
    } else {
       System.out.println("Element is displayed");
    }
}

public void assertElementNotPresentById(String elementById)  {
    By element = By.id(elementById);
    assertElementNotPresentBase(element);
}

public void assertElementNotPresentByXpath(String elementByXpath) {
    By element = By.xpath(elementByXpath);
    assertElementNotPresentBaseelement);
}