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

assertRaises в тестах webdriver на python, для проверки отсутствия элемента


(Евгений Муравьёв) #1

Добрый день, уважаемые форумчане.

Вопрос: как правильно использовать assertRaises для для проверки отсутствия элемента. Что то в таком роде: self.assertRaises(NoSuchElementException, driver.find_element_by_xpath, 'xpath')]') выдаёт ошибку “AssertionError: NoSuchElementException not raised by find_element_by_xpath


(Romanchuk Katerina) #2

Может как-то так, посмотрите, написала примеры использования assertRaises.

import unittest


def sum(a, b):
    return a + b


def find_element(a):
    if not a in [5, 10, 15]:
        raise Exception('%i is absent' % a)

#####################################


class TestExample(unittest.TestCase):

    def test1(self):
        self.assertRaises(TypeError, sum, 1000, 'a string')

    def test2(self):
        self.assertRaises(Exception, find_element, 123456)

if __name__ == '__main__':
    unittest.main()

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

а ожидалось какое поведение?


(Mykhailo Poliarush) #4

А по xpath действительно есть такой элемент на странице или нет?


(Евгений Муравьёв) #5

Спасибо всем, кто участвует в обсуждении. Для себя решение нашел в виде предложенном Katya. А задача состоит в том, что бы проверить отсутствие элемента load - индикатора на странице. И выношу его на Ваш суд. По-моему, получается как то кривовато

def find_el(xpath):
   try:   
    put = driver.find_element_by_xpath(xpath)
   except NoSuchElementException:
       raise Exception
   
 driver.get('https://my_web_site')
 self.assertRaises(Exception, find_el, 'xpath')

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

почему не проверять сразу NoSuchElementException? Зачем другое исключение выбрасывать и только тогда проверять?

Вообще, напиши словами алгоритм, что ты хочешь получить. Так проще будет его перевести на язык программирования


(Romanchuk Katerina) #8

А зачем так перехватываете ексепшен, выглядит странно. И зачем воообще привязались к assertRaises? Используйте ассершены, которые вам удобны.

Может как-то так вообще просто написать и все:

def test_find_element(xpath):
    try:
        driver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        self.fail("There are no element '%s'" % xpath)

Чем проще написан тест - тем лучше.


(Romanchuk Katerina) #9

Согласна


(Евгений Муравьёв) #10

Извиняюсь за то, что не сразу описал алгоритм теста. Итак:

  1. имеется реестр заявок
  2. нажимаю в этом реестре кнопку “Добавить”
  3. в новом окне открывается форма заявки
  4. заполняю форму нажимаю кнопку “Сохранить”
    Хочу проверить, что
  5. а) по кнопке “сохранить” форма заявки не закрывается
  6. б) не висит лоадинг индикатор свыше определенного времени - тот самый элемент, присутствие которого нежелательно

На пункте 5 б) и загвостка: если использовать

try: ... except ..:

Тест не падает в случае присутствия индикатора, поэтому и использовал assertRaises


(Romanchuk Katerina) #11

Можно просто ставить fail в любом нужном для вас месте. Поставьте проверку присудствия индикатора и если он есть - тест фейл.

    def test_nothing(self):
        self.fail("shouldn't happen")

(Александр Таранков) #12
  1. Есть такая штука в WebDriver как Wait и ExpectedCondition. Там можно ожидать различных условий, в том числе и Wait for element invisible
  2. Мне кажется тест сам по себе странным. Этот элемент ожидания загрузки что, на каждом скрине реализован по разному? Для чего его проверять при выполнении каждого действия? Достаточно проверить, что механизм ожидания загрузки (фича) работает. Это отдельный тест.
  3. В этом тесте достаточно проверить
    • элемент ожидания загрузки появляется
    • элемент ожидания загрузки исчезает не позже чем через максимально возможный промежуток времени
    • во время присутствия этого элемента взаимодействие с формой заблокировано (тут зависит от реализации этого элемента)
  4. А твой исходный тест не должен думать о том есть элемент загрузки или нет. Он должен просто выполнять свой алгоритм проверки