Как мне сделать снимок экрана, если мои носовые тесты не пройдены?

Я запускаю тесты веб-драйвера селена с помощью носовых тестов. Я хочу делать снимок экрана всякий раз, когда носовые тесты терпят неудачу. Как я могу сделать это наиболее эффективным способом, используя функции веб-драйвера, Python или Nosetests?


person nids    schedule 20.02.2013    source источник
comment
Аналогично, но для unittest: Как выполнить код только при сбоях теста с помощью python unittest2? в SO   -  person kenorb    schedule 16.05.2015


Ответы (4)


Мое решение

import sys, unittest
from datetime import datetime

class TestCase(unittest.TestCase):

    def setUp(self):
        some_code

    def test_case(self):
        blah-blah-blah

    def tearDown(self):
        if sys.exc_info()[0]:  # Returns the info of exception being handled 
            fail_url = self.driver.current_url
            print fail_url
            now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S-%f')
            self.driver.get_screenshot_as_file('/path/to/file/%s.png' % now) # my tests work in parallel, so I need uniqe file names
            fail_screenshot_url = 'http://debugtool/screenshots/%s.png' % now
            print fail_screenshot_url
        self.driver.quit()
person Furious Duck    schedule 27.02.2013
comment
Вопрос касается фреймворка nose, а не стандартного unittest. - person Alex Okrushko; 28.02.2013
comment
с помощью функций webdriver, python или Nosetests - person Furious Duck; 28.02.2013
comment
Я не думаю, что python подразумевает использование другого фреймворка (например, unittest), однако я могу ошибаться. - person Alex Okrushko; 28.02.2013
comment
В любом случае, AFAIK в методах setUp и tearDown фреймворка носа можно использовать. Я только что показал структуру тестового костюма. - person Furious Duck; 28.02.2013
comment
Nose будет запускать тесты, написанные с пакетом unittest, поэтому с этим ответом проблем нет. - person Dan Passaro; 19.04.2013
comment
Не работает, в моем случае sys.exc_info()[0] возвращает ‹class 'Queue.Empty'›, поэтому он все равно делает снимок экрана, поскольку он не None. Значение sys.exc_info() --› (‹класс 'Queue.Empty'›, Empty(), ‹объект трассировки по адресу 0x0000000002DEDA08›) - person Deep; 29.12.2014
comment
@Deep Deep, ответ достаточно старый. Сейчас я использую py.test для своих тестов, и захват скриншота при сбое здесь немного сложнее. Предоставьте некоторую информацию о ваших тестах, и я постараюсь вам помочь - person Furious Duck; 29.12.2014
comment
@Deep, да начнется некропостинг! использование sys.exc_info() зависит от ОС. Приведенный пример отлично работает, например, в Ubuntu. - person Furious Duck; 21.02.2016

Во-первых, в webdriver есть команда:

driver.get_screenshot_as_file(screenshot_file_path)

Я не эксперт в области носа (на самом деле, я впервые в этом разбираюсь), однако я использую py.test< /a> framework (который похож, но превосходит nose ИМХО).

Скорее всего, вам придется создать "плагин" для носа, где вам придется реализовать хук addFailure(test, err) который "Вызывается при сбое теста".

В этом addFailure(test, err) вы можете получить имя теста из тестового объекта и создайте путь к файлу.

После этого позвоните driver.get_screenshot_as_file(screenshot_file_path).

В py.test я создаю свой плагин с реализацией хука def pytest_runtest_makereport(item, call):. Внутри я анализирую call.excinfo и при необходимости делаю скриншот.

person Alex Okrushko    schedule 21.02.2013
comment
Я пробовал это, но не могу получить экземпляр TestCase в addFailure(). Не могли бы вы рассказать, как это возможно (просто зная имя теста, которое указывает мне только на соответствующий класс, а не на экземпляр) - person vvondra; 06.02.2014

Возможно, вы настроили свои тесты по-другому, но по моему опыту вам нужно вручную встроить этот тип функциональности и повторить его в момент сбоя. Если вы выполняете тесты на селен, скорее всего, как и я, вы используете много find_element_by_something. Я написал следующую функцию, чтобы позволить мне заниматься этим типом вещей:

def findelement(self, selector, name, keys='', click=False):

    if keys:
        try:
            self.driver.find_element_by_css_selector(selector).send_keys(keys)
        except NoSuchElementException:
            self.fail("Tried to send %s into element %s but did not find the element." % (keys, name))
    elif click:
        try:
            self.driver.find_element_by_css_selector(selector).click()
        except NoSuchElementException:
            self.fail("Tried to click element %s but did not find it." % name)
    else:
        try:
            self.driver.find_element_by_css_selector(selector)
        except NoSuchElementException:
            self.fail("Expected to find element %s but did not find it." % name)

В вашем случае код скриншота (self.driver.get_screenshot_as_file(screenshot_file_path)) будет идти перед self.fail.

С этим кодом каждый раз, когда вы хотите взаимодействовать с элементом, вы будете вызывать self.findelement('selector', 'element name')

person Cronax    schedule 09.02.2015

В Python вы можете использовать следующий код:

driver.save_screenshot('/file/screenshot.png')
person Kv.senthilkumar    schedule 21.02.2013