Я запускаю тесты веб-драйвера селена с помощью носовых тестов. Я хочу делать снимок экрана всякий раз, когда носовые тесты терпят неудачу. Как я могу сделать это наиболее эффективным способом, используя функции веб-драйвера, Python или Nosetests?
Как мне сделать снимок экрана, если мои носовые тесты не пройдены?
Ответы (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()
nose
, а не стандартного unittest
.
- person Alex Okrushko; 28.02.2013
unittest
, поэтому с этим ответом проблем нет.
- person Dan Passaro; 19.04.2013
Во-первых, в 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
и при необходимости делаю скриншот.
Возможно, вы настроили свои тесты по-другому, но по моему опыту вам нужно вручную встроить этот тип функциональности и повторить его в момент сбоя. Если вы выполняете тесты на селен, скорее всего, как и я, вы используете много 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')
В Python вы можете использовать следующий код:
driver.save_screenshot('/file/screenshot.png')