def append_extra_html(self, extra, extra_index, test_index): href = None if extra.get('format') == extras.FORMAT_IMAGE: content = extra.get('content') if content.startswith(('file', 'http')) or \ os.path.isfile(content): if self.self_contained: warnings.warn('Self-contained HTML report ' 'includes link to external ' 'resource: {}'.format(content)) html_div = html.a(html.img(src=content), href=content) elif self.self_contained: src = 'data:{0};base64,{1}'.format(extra.get('mime_type'), content) html_div = html.img(src=src) else: if PY3: content = b64decode(content.encode('utf-8')) else: content = b64decode(content) href = src = self.create_asset(content, extra_index, test_index, extra.get('extension'), 'wb') html_div = html.a(html.img(src=src), href=href) self.additional_html.append(html.div(html_div, class_='image')) elif extra.get('format') == extras.FORMAT_HTML: self.additional_html.append(html.div(raw( extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: content = json.dumps(extra.get('content')) if self.self_contained: href = data_uri(content, mime_type=extra.get('mime_type')) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_TEXT: content = extra.get('content') if self.self_contained: href = data_uri(content) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: self.links_html.append( html.a(extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) self.links_html.append(' ')
def append_extra_html(self, extra, extra_index, test_index): href = None if extra.get('format') == extras.FORMAT_IMAGE: if self.self_contained: src = 'data:{0};base64,{1}'.format(extra.get('mime_type'), extra.get('content')) self.additional_html.append( html.div(html.img(src=src), class_='image')) else: content = extra.get('content') if PY3: content = b64decode(content.encode('utf-8')) else: content = b64decode(content) href = src = self.create_asset(content, extra_index, test_index, extra.get('extension'), 'wb') self.additional_html.append( html.div(html.a(html.img(src=src), href=href), class_='image')) elif extra.get('format') == extras.FORMAT_HTML: self.additional_html.append(html.div(raw( extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: content = json.dumps(extra.get('content')) if self.self_contained: href = data_uri(content, mime_type=extra.get('mime_type')) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_TEXT: content = extra.get('content') if self.self_contained: href = data_uri(content) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: self.links_html.append( html.a(extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) self.links_html.append(' ')
def append_screenshot(self, name, log): name = re.sub('[^A-Za-z0-9_. ]+', '', name) if not os.path.exists(self.screenshot_path): os.makedirs(self.screenshot_path) source = os.path.join(self.project_root, 'screenshots', name + '.png') self.used_screens.append(source) log.append(html.img(src='screenshots/' + name + '.png'))
def append_extra_html(self, extra, additional_html, links_html): href = None if extra.get('format') == extras.FORMAT_IMAGE: href = '#' image = 'data:image/png;base64,{0}'.format( extra.get('content')) additional_html.append(html.div( html.a(html.img(src=image), href="#"), class_='image')) elif extra.get('format') == extras.FORMAT_HTML: additional_html.append(html.div(raw(extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: href = data_uri(json.dumps(extra.get('content')), mime_type='application/json') elif extra.get('format') == extras.FORMAT_TEXT: href = data_uri(extra.get('content')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: links_html.append(html.a( extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) links_html.append(' ')
def make_result_html(self, data): tc_time = (data["time"] - self.start_times.pop(data["test"])) / 1000. additional_html = [] debug = data.get("extra", {}) links_html = [] status = status_name = data["status"] expected = data.get("expected", status) if status != expected: status_name = "UNEXPECTED_" + status elif status != "PASS": status_name = "EXPECTED_" + status self.test_count[status_name] += 1 if status in ['SKIP', 'FAIL', 'ERROR']: if debug.get('screenshot'): screenshot = 'data:image/png;base64,%s' % debug['screenshot'] additional_html.append(html.div( html.a(html.img(src=screenshot), href="#"), class_='screenshot')) for name, content in debug.items(): if 'screenshot' in name: href = '#' else: # use base64 to avoid that some browser (such as Firefox, Opera) # treats '#' as the start of another link if the data URL contains. # use 'charset=utf-8' to show special characters like Chinese. href = 'data:text/plain;charset=utf-8;base64,%s' % base64.b64encode(content.encode('utf-8')) links_html.append(html.a( name.title(), class_=name, href=href, target='_blank')) links_html.append(' ') log = html.div(class_='log') output = data.get('stack', '').splitlines() output.extend(data.get('message', '').splitlines()) for line in output: separator = line.startswith(' ' * 10) if separator: log.append(line[:80]) else: if line.lower().find("error") != -1 or line.lower().find("exception") != -1: log.append(html.span(raw(cgi.escape(line)), class_='error')) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) self.result_rows.append( html.tr([html.td(status_name, class_='col-result'), html.td(data['test'], class_='col-name'), html.td('%.2f' % tc_time, class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='debug')], class_=status_name.lower() + ' results-table-row'))
def _appendrow(self, result, report): time = getattr(report, 'duration', 0.0) additional_html = [] links_html = [] for extra in getattr(report, 'extra', []): href = None if extra.get('format') == extras.FORMAT_IMAGE: href = '#' image = 'data:image/png;base64,%s' % extra.get('content') additional_html.append(html.div( html.a(html.img(src=image), href="#"), class_='image')) elif extra.get('format') == extras.FORMAT_HTML: additional_html.append(extra.get('content')) elif extra.get('format') == extras.FORMAT_JSON: href = data_uri(json.dumps(extra.get('content')), mime_type='application/json') elif extra.get('format') == extras.FORMAT_TEXT: href = data_uri(extra.get('content')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: links_html.append(html.a( extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) links_html.append(' ') if 'Passed' not in result: if report.longrepr: log = html.div(class_='log') for line in str(report.longrepr).splitlines(): if not PY3: line = line.decode('utf-8') separator = line.startswith('_ ' * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(escape(line)), class_='error')) else: log.append(raw(escape(line))) log.append(html.br()) additional_html.append(log) self.test_logs.append(html.tr([ html.td(result, class_='col-result'), html.td(report.nodeid, class_='col-name'), html.td('%.2f' % time, class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='extra')], class_=result.lower() + ' results-table-row'))
def _appendrow(self, result, report): time = getattr(report, 'duration', 0.0) additional_html = [] links_html = [] if 'Passed' not in result: for extra in getattr(report, 'extra', []): href = None if type(extra) is Image: href = '#' image = 'data:image/png;base64,%s' % extra.content additional_html.append(html.div( html.a(html.img(src=image), href="#"), class_='image')) elif type(extra) is HTML: additional_html.append(extra.content) elif type(extra) is Text: href = 'data:text/plain;charset=utf-8;base64,%s' % \ b64encode(extra.content) elif type(extra) is URL: href = extra.content if href is not None: links_html.append(html.a( extra.name, class_=extra.__class__.__name__.lower(), href=href, target='_blank')) links_html.append(' ') if report.longrepr: log = html.div(class_='log') for line in str(report.longrepr).splitlines(): line = line.decode('utf-8') separator = line.startswith('_ ' * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(cgi.escape(line)), class_='error')) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) self.test_logs.append(html.tr([ html.td(result, class_='col-result'), html.td(report.nodeid, class_='col-name'), html.td('%.2f' % time, class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='extra')], class_=result.lower() + ' results-table-row'))
def _extract_html(test, class_name, duration=0, text='', result='passed', debug=None): cls_name = class_name tc_name = unicode(test) tc_time = duration additional_html = [] debug = debug or {} links_html = [] if result in ['skipped', 'failure', 'expected failure', 'error']: if debug.get('screenshot'): screenshot = 'data:image/png;base64,%s' % debug['screenshot'] additional_html.append(html.div( html.a(html.img(src=screenshot), href="#"), class_='screenshot')) for name, content in debug.items(): try: if 'screenshot' in name: href = '#' else: # use base64 to avoid that some browser (such as Firefox, Opera) # treats '#' as the start of another link if the data URL contains. # use 'charset=utf-8' to show special characters like Chinese. href = 'data:text/plain;charset=utf-8;base64,%s' % base64.b64encode(content) links_html.append(html.a( name.title(), class_=name, href=href, target='_blank')) links_html.append(' ') except: pass log = html.div(class_='log') for line in text.splitlines(): separator = line.startswith(' ' * 10) if separator: log.append(line[:80]) else: if line.lower().find("error") != -1 or line.lower().find("exception") != -1: log.append(html.span(raw(cgi.escape(line)), class_='error')) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) test_logs.append(html.tr([ html.td(result.title(), class_='col-result'), html.td(cls_name, class_='col-class'), html.td(tc_name, class_='col-name'), html.td(tc_time, class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='debug')], class_=result.lower() + ' results-table-row'))
def _extract_html(test, class_name, duration=0, text="", result="passed", debug=None): cls_name = class_name tc_name = unicode(test) tc_time = duration additional_html = [] debug = debug or {} links_html = [] if result in ["skipped", "failure", "expected failure", "error"]: if debug.get("screenshot"): screenshot = "data:image/png;base64,%s" % debug["screenshot"] additional_html.append(html.div(html.a(html.img(src=screenshot), href="#"), class_="screenshot")) for name, content in debug.items(): try: if "screenshot" in name: href = "#" else: # use base64 to avoid that some browser (such as Firefox, Opera) # treats '#' as the start of another link if the data URL contains. # use 'charset=utf-8' to show special characters like Chinese. href = "data:text/plain;charset=utf-8;base64,%s" % base64.b64encode(content) links_html.append(html.a(name.title(), class_=name, href=href, target="_blank")) links_html.append(" ") except: pass log = html.div(class_="log") for line in text.splitlines(): separator = line.startswith(" " * 10) if separator: log.append(line[:80]) else: if line.lower().find("error") != -1 or line.lower().find("exception") != -1: log.append(html.span(raw(cgi.escape(line)), class_="error")) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) test_logs.append( html.tr( [ html.td(result.title(), class_="col-result"), html.td(cls_name, class_="col-class"), html.td(tc_name, class_="col-name"), html.td(tc_time, class_="col-duration"), html.td(links_html, class_="col-links"), html.td(additional_html, class_="debug"), ], class_=result.lower() + " results-table-row", ) )
def _append_screenshot(self, name, log): name = re.sub('[^A-Za-z0-9_.]+', '_', name) images_saved = os.path.join(self.project_root, 'screenshots') if os.path.isdir(images_saved) and len(os.listdir(images_saved)) > 0: log.append(html.h3('Screenshots')) for file in os.listdir(images_saved): image_path = os.path.join(images_saved, file) if name in image_path: self.used_screens.append(image_path) # use relative path in img src source = image_path.replace(self.project_root, '.') log.append(source) log.append(html.br()) log.append(html.img(src=source)) log.append(html.br())
def pytest_html_results_table_html(report, data): if report.outcome == 'failed': data[0].append(html.br()) data[0].append(html.img(src=report.screenshot))
def _appendrow(self, result, report): import pytest_mozwebqa (testclass, testmethod) = pytest_mozwebqa.split_class_and_test_names(report.nodeid) time = getattr(report, 'duration', 0.0) links = {} if hasattr(report, 'debug') and any(report.debug.values()): (relative_path, full_path) = self._debug_paths(testclass, testmethod) if report.debug['screenshots']: filename = 'screenshot.png' f = open(os.path.join(full_path, filename), 'wb') f.write(base64.decodestring(report.debug['screenshots'][-1])) links.update({'Screenshot': os.path.join(relative_path, filename)}) if report.debug['html']: filename = 'html.txt' f = open(os.path.join(full_path, filename), 'wb') f.write(report.debug['html'][-1]) links.update({'HTML': os.path.join(relative_path, filename)}) # Log may contain passwords, etc so we only capture it for tests marked as public if report.debug['logs'] and 'public' in report.keywords: filename = 'log.txt' f = open(os.path.join(full_path, filename), 'wb') f.write(report.debug['logs'][-1]) links.update({'Log': os.path.join(relative_path, filename)}) if report.debug['network_traffic']: filename = 'networktraffic.json' f = open(os.path.join(full_path, filename), 'wb') f.write(report.debug['network_traffic'][-1]) links.update({'Network Traffic': os.path.join(relative_path, filename)}) if report.debug['urls']: links.update({'Failing URL': report.debug['urls'][-1]}) if self.config.option.sauce_labs_credentials_file and hasattr(report, 'session_id'): links['Sauce Labs Job'] = 'http://saucelabs.com/jobs/%s' % report.session_id links_html = [] for name, path in links.iteritems(): links_html.append(html.a(name, href=path)) links_html.append(' ') self.test_logs.append( html.tr(html.td(result, class_=result.lower()), html.td(testclass), html.td(testmethod), html.td(round(time)), html.td(*links_html), class_=result.lower())) if not 'Passed' in result: additional_html = [] if self.config.option.sauce_labs_credentials_file and hasattr(report, 'session_id'): flash_vars = 'config={\ "clip":{\ "url":"http%%3A//saucelabs.com/jobs/%(session_id)s/video.flv",\ "provider":"streamer",\ "autoPlay":false,\ "autoBuffering":true},\ "plugins":{\ "streamer":{\ "url":"http://saucelabs.com/flowplayer/flowplayer.pseudostreaming-3.2.5.swf"},\ "controls":{\ "mute":false,\ "volume":false,\ "backgroundColor":"rgba(0, 0, 0, 0.7)"}},\ "playerId":"player%(session_id)s",\ "playlist":[{\ "url":"http%%3A//saucelabs.com/jobs/%(session_id)s/video.flv",\ "provider":"streamer",\ "autoPlay":false,\ "autoBuffering":true}]}' % {'session_id': report.session_id} additional_html.append( html.div( html.object( html.param(value='true', name='allowfullscreen'), html.param(value='always', name='allowscriptaccess'), html.param(value='high', name='quality'), html.param(value='true', name='cachebusting'), html.param(value='#000000', name='bgcolor'), html.param(value=flash_vars.replace(' ', ''), name='flashvars'), width='100%', height='100%', type='application/x-shockwave-flash', data='http://saucelabs.com/flowplayer/flowplayer-3.2.5.swf?0.2566397726976729', name='player_api', id='player_api'), id='player%s' % report.session_id, class_='video')) if 'Screenshot' in links: additional_html.append( html.div( html.a(html.img(src=links['Screenshot']), href=links['Screenshot']), class_='screenshot')) if report.longrepr: log = html.div(class_='log') for line in str(report.longrepr).splitlines(): separator = line.startswith('_ ' * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(cgi.escape(line)), class_='error')) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) self.test_logs.append( html.tr( html.td(*additional_html, colspan='5')))
def _appendrow(self, result, report): import pytest_mozwebqa (testclass, testmethod) = pytest_mozwebqa.split_class_and_test_names(report.nodeid) time = getattr(report, 'duration', 0.0) links = {} if hasattr(report, 'debug') and any(report.debug.values()): (relative_path, full_path) = self._debug_paths(testclass, testmethod) if report.debug['screenshots']: filename = 'screenshot.png' f = open(os.path.join(full_path, filename), 'wb') f.write(base64.decodestring(report.debug['screenshots'][-1])) links.update({'Screenshot': os.path.join(relative_path, filename)}) if report.debug['html']: filename = 'html.txt' f = open(os.path.join(full_path, filename), 'wb') f.write(report.debug['html'][-1]) links.update({'HTML': os.path.join(relative_path, filename)}) # Log may contain passwords, etc so we only capture it for tests marked as public if report.debug['logs'] and 'public' in report.keywords: filename = 'log.txt' f = open(os.path.join(full_path, filename), 'wb') f.write(report.debug['logs'][-1]) links.update({'Log': os.path.join(relative_path, filename)}) if report.debug['network_traffic']: filename = 'networktraffic.json' f = open(os.path.join(full_path, filename), 'wb') f.write(report.debug['network_traffic'][-1]) links.update({'Network Traffic': os.path.join(relative_path, filename)}) if report.debug['urls']: links.update({'Failing URL': report.debug['urls'][-1]}) if self.config.option.sauce_labs_credentials_file and hasattr(report, 'session_id'): self.sauce_labs_job = sauce_labs.Job(report.session_id) if hasattr(self, 'sauce_labs_job'): links['Sauce Labs Job'] = self.sauce_labs_job.url links_html = [] for name, path in links.iteritems(): links_html.append(html.a(name, href=path)) links_html.append(' ') additional_html = [] if not 'Passed' in result: if hasattr(self, 'sauce_labs_job'): additional_html.append(self.sauce_labs_job.video_html) if 'Screenshot' in links: additional_html.append( html.div( html.a(html.img(src=links['Screenshot']), href=links['Screenshot']), class_='screenshot')) if report.longrepr: log = html.div(class_='log') for line in str(report.longrepr).splitlines(): separator = line.startswith('_ ' * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(cgi.escape(line)), class_='error')) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) self.test_logs.append(html.tr([ html.td(result, class_='col-result'), html.td(testclass, class_='col-class'), html.td(testmethod, class_='col-name'), html.td(round(time), class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='debug')], class_=result.lower() + ' results-table-row'))
def append_extra_html(self, extra, extra_index, test_index): href = None #print() #print('-------append_extra_html----------') #print(extra) if extra.get('format') == extras.FORMAT_IMAGE: content = extra.get('content') try: is_uri_or_path = (content.startswith(('file', 'http')) or isfile(content)) except ValueError: # On Windows, os.path.isfile throws this exception when # passed a b64 encoded image. is_uri_or_path = False if is_uri_or_path: if self.self_contained: warnings.warn('Self-contained HTML report ' 'includes link to external ' 'resource: {}'.format(content)) html_div = html.a(html.img(src=content), href=content) elif self.self_contained: src = 'data:{0};base64,{1}'.format( extra.get('mime_type'), content) html_div = html.img(src=src) #print('extra content len: ',len(content)) else: if PY3: content = b64decode(content.encode('utf-8')) else: content = b64decode(content) href = src = self.create_asset( content, extra_index, test_index, extra.get('extension'), 'wb') html_div = html.a(html.img(src=src), href=href) self.additional_html.append(html.div(html_div, class_='image')) elif extra.get('format') == extras.FORMAT_HTML: self.additional_html.append(html.div( raw(extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: content = json.dumps(extra.get('content')) if self.self_contained: href = data_uri(content, mime_type=extra.get('mime_type')) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_TEXT: content = extra.get('content') if isinstance(content, bytes): content = content.decode('utf-8') if self.self_contained: href = data_uri(content) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: self.links_html.append(html.a( extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) self.links_html.append(' ')
def make_result_html(self, data): cls_name = "" tc_name = unicode(data["test"]) tc_time = (data["time"] - self.start_times.pop(data["test"])) / 1000.0 additional_html = [] debug = data.get("extra", {}) links_html = [] status = status_name = data["status"] expected = data.get("expected", status) if status != expected: status_name = "UNEXPECTED_" + status elif status != "PASS": status_name = "EXPECTED_" + status self.test_count[status_name] += 1 if status in ["SKIP", "FAIL", "ERROR"]: if debug.get("screenshot"): screenshot = "data:image/png;base64,%s" % debug["screenshot"] additional_html.append(html.div(html.a(html.img(src=screenshot), href="#"), class_="screenshot")) for name, content in debug.items(): try: if "screenshot" in name: href = "#" else: # use base64 to avoid that some browser (such as Firefox, Opera) # treats '#' as the start of another link if the data URL contains. # use 'charset=utf-8' to show special characters like Chinese. href = "data:text/plain;charset=utf-8;base64,%s" % base64.b64encode(content) links_html.append(html.a(name.title(), class_=name, href=href, target="_blank")) links_html.append(" ") except: pass log = html.div(class_="log") for line in debug.get("stdout", "").splitlines(): separator = line.startswith(" " * 10) if separator: log.append(line[:80]) else: if line.lower().find("error") != -1 or line.lower().find("exception") != -1: log.append(html.span(raw(cgi.escape(line)), class_="error")) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) self.result_rows.append( html.tr( [ html.td(status_name, class_="col-result"), html.td(cls_name, class_="col-class"), html.td(tc_name, class_="col-name"), html.td("%.2f" % tc_time, class_="col-duration"), html.td(links_html, class_="col-links"), html.td(additional_html, class_="debug"), ], class_=status_name.lower() + " results-table-row", ) )
def _appendrow(self, result, report): time = getattr(report, 'duration', 0.0) additional_html = [] links_html = [] for extra in getattr(report, 'extra', []): href = None if extra.get('format') == extras.FORMAT_IMAGE: href = '#' image = 'data:image/png;base64,{0}'.format( extra.get('content')) additional_html.append( html.div(html.a(html.img(src=image), href="#"), class_='image')) elif extra.get('format') == extras.FORMAT_HTML: additional_html.append(html.div(raw(extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: href = data_uri(json.dumps(extra.get('content')), mime_type='application/json') elif extra.get('format') == extras.FORMAT_TEXT: href = data_uri(extra.get('content')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: links_html.append( html.a(extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) links_html.append(' ') if report.longrepr: log = html.div(class_='log') for line in str(report.longrepr).splitlines(): if not PY3: line = line.decode('utf-8') separator = line.startswith('_ ' * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(escape(line)), class_='error')) else: log.append(raw(escape(line))) log.append(html.br()) for header, content in report.sections: log.append(' {0} '.format(header).center(80, '-')) log.append(html.br()) log.append(content) else: log = html.div(class_='empty log') log.append('No log output captured.') additional_html.append(log) self.test_logs.append( html.tr([ html.td(result, class_='col-result'), html.td(report.nodeid, class_='col-name'), html.td('{0:.2f}'.format(time), class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='extra') ], class_=result.lower() + ' results-table-row'))
def _appendrow(self, result, report): time = getattr(report, 'duration', 0.0) additional_html = [] links_html = [] for extra in getattr(report, 'extra', []): href = None if extra.get('format') == extras.FORMAT_IMAGE: href = '#' image = 'data:image/png;base64,{0}'.format( extra.get('content')) additional_html.append(html.div( html.a(html.img(src=image), href="#"), class_='image')) elif extra.get('format') == extras.FORMAT_HTML: additional_html.append(html.div(raw(extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: href = data_uri(json.dumps(extra.get('content')), mime_type='application/json') elif extra.get('format') == extras.FORMAT_TEXT: href = data_uri(extra.get('content')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: links_html.append(html.a( extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) links_html.append(' ') if report.longrepr: log = html.div(class_='log') for line in str(report.longrepr).splitlines(): if not PY3: line = line.decode('utf-8') separator = line.startswith('_ ' * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(escape(line)), class_='error')) else: log.append(raw(escape(line))) log.append(html.br()) for header, content in report.sections: log.append(' {0} '.format(header).center(80, '-')) log.append(html.br()) log.append(content) else: log = html.div(class_='empty log') log.append('No log output captured.') additional_html.append(log) test_id = report.nodeid if report.when != 'call': test_id = '::'.join([report.nodeid, report.when]) self.test_logs.append(html.tr([ html.td(result, class_='col-result'), html.td(test_id, class_='col-name'), html.td('{0:.2f}'.format(time), class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='extra')], class_=result.lower() + ' results-table-row'))
def _appendrow(self, result, report): time = getattr(report, "duration", 0.0) additional_html = [] # links_html = [] for extra in getattr(report, "extra", []): href = None if extra.get("format") == extras.FORMAT_IMAGE: href = "#" image = "%s" % extra.get("content") if os.path.isfile(image): with open(image, "rb") as image_file: image_file = b64encode(image_file.read()) image = "data:image/png;base64,%s" % image_file else: image = "data:image/png;base64,%s" % image additional_html.append(html.div(html.a(html.img(src=image), href="#"), class_="image")) elif extra.get("format") == extras.FORMAT_HTML: additional_html.append(extra.get("content")) elif extra.get("format") == extras.FORMAT_JSON: href = data_uri(json.dumps(extra.get("content")), mime_type="application/json") elif extra.get("format") == extras.FORMAT_TEXT: href = data_uri(extra.get("content")) elif extra.get("format") == extras.FORMAT_URL: href = extra.get("content") # if href is not None: # links_html.append(html.a( # extra.get('name'), # class_=extra.get('format'), # href=href, # target='_blank')) # links_html.append(' ') if "Passed" not in result: if report.longrepr: log = html.div(class_="log") for line in str(report.longrepr).splitlines(): if not PY3: line = line.decode("utf-8") separator = line.startswith("_ " * 10) if separator: log.append(line[:80]) else: exception = line.startswith("E ") if exception: log.append(html.span(raw(escape(line)), class_="error")) else: log.append(raw(escape(line))) log.append(html.br()) additional_html.append(log) self.test_logs.append( html.tr( [ html.td(result, class_="col-result"), html.td(report.nodeid, class_="col-name"), html.td("%.2f" % time, class_="col-duration"), # html.td(links_html, class_='col-links'), html.td(additional_html, class_="extra"), ], class_=result.lower() + " results-table-row", ) )
def make_result_html(self, data): cls_name = "" tc_name = unicode(data["test"]) tc_time = (data["time"] - self.start_times.pop(data["test"])) / 1000. additional_html = [] debug = data.get("extra", {}) links_html = [] status = data["status"] expected = data.get("expected", status) if status != expected: if status == "PASS": status_name = "UNEXPECTED_" + status else: status_name = "EXPECTED_" + status else: status_name = status self.test_count[status_name] += 1 if status in ['SKIP', 'FAIL', 'ERROR']: if debug.get('screenshot'): screenshot = 'data:image/png;base64,%s' % debug['screenshot'] additional_html.append( html.div(html.a(html.img(src=screenshot), href="#"), class_='screenshot')) for name, content in debug.items(): try: if 'screenshot' in name: href = '#' else: # use base64 to avoid that some browser (such as Firefox, Opera) # treats '#' as the start of another link if the data URL contains. # use 'charset=utf-8' to show special characters like Chinese. href = 'data:text/plain;charset=utf-8;base64,%s' % base64.b64encode( content) links_html.append( html.a(name.title(), class_=name, href=href, target='_blank')) links_html.append(' ') except: pass log = html.div(class_='log') for line in debug.get("stdout", "").splitlines(): separator = line.startswith(' ' * 10) if separator: log.append(line[:80]) else: if line.lower().find("error") != -1 or line.lower().find( "exception") != -1: log.append( html.span(raw(cgi.escape(line)), class_='error')) else: log.append(raw(cgi.escape(line))) log.append(html.br()) additional_html.append(log) self.result_rows.append( html.tr([ html.td(status_name, class_='col-result'), html.td(cls_name, class_='col-class'), html.td(tc_name, class_='col-name'), html.td("%.2f" % tc_time, class_='col-duration'), html.td(links_html, class_='col-links'), html.td(additional_html, class_='debug') ], class_=status_name.lower() + ' results-table-row'))
def append_extra_html(self, extra, extra_index, test_index): href = None if extra.get('format') == extras.FORMAT_IMAGE: content = extra.get('content') try: is_uri_or_path = (content.startswith(('file', 'http')) or isfile(content)) except ValueError: # On Windows, os.path.isfile throws this exception when # passed a b64 encoded image. is_uri_or_path = False if is_uri_or_path: if self.self_contained: warnings.warn('Self-contained HTML report ' 'includes link to external ' 'resource: {}'.format(content)) html_div = html.a(html.img(src=content), href=content) elif self.self_contained: src = 'data:{0};base64,{1}'.format( extra.get('mime_type'), content) html_div = html.img(src=src) else: if PY3: content = b64decode(content.encode('utf-8')) else: content = b64decode(content) href = src = self.create_asset( content, extra_index, test_index, extra.get('extension'), 'wb') html_div = html.a(html.img(src=src), href=href) self.additional_html.append(html.div(html_div, class_='image')) elif extra.get('format') == extras.FORMAT_HTML: self.additional_html.append(html.div( raw(extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: content = json.dumps(extra.get('content')) if self.self_contained: href = data_uri(content, mime_type=extra.get('mime_type')) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_TEXT: content = extra.get('content') if isinstance(content, bytes): content = content.decode('utf-8') if self.self_contained: href = data_uri(content) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: self.links_html.append(html.a( extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) self.links_html.append(' ')
def append_extra_html(self, extra, extra_index, test_index): href = None if extra.get("format") == extras.FORMAT_IMAGE: content = extra.get("content") try: is_uri_or_path = content.startswith( ("file", "http")) or isfile(content) except ValueError: # On Windows, os.path.isfile throws this exception when # passed a b64 encoded image. is_uri_or_path = False if is_uri_or_path: if self.self_contained: warnings.warn("Self-contained HTML report " "includes link to external " "resource: {}".format(content)) html_div = html.a(html.img(src=content), href=content) elif self.self_contained: src = "data:{};base64,{}".format(extra.get("mime_type"), content) html_div = html.img(src=src) else: content = b64decode(content.encode("utf-8")) href = src = self.create_asset(content, extra_index, test_index, extra.get("extension"), "wb") html_div = html.a(html.img(src=src), href=href) self.additional_html.append(html.div(html_div, class_="image")) elif extra.get("format") == extras.FORMAT_HTML: self.additional_html.append(html.div(raw( extra.get("content")))) elif extra.get("format") == extras.FORMAT_JSON: content = json.dumps(extra.get("content")) if self.self_contained: href = data_uri(content, mime_type=extra.get("mime_type")) else: href = self.create_asset(content, extra_index, test_index, extra.get("extension")) elif extra.get("format") == extras.FORMAT_TEXT: content = extra.get("content") if isinstance(content, bytes): content = content.decode("utf-8") if self.self_contained: href = data_uri(content) else: href = self.create_asset(content, extra_index, test_index, extra.get("extension")) elif extra.get("format") == extras.FORMAT_URL: href = extra.get("content") if href is not None: self.links_html.append( html.a( extra.get("name"), class_=extra.get("format"), href=href, target="_blank", )) self.links_html.append(" ")
def append_extra_html(self, extra, extra_index, test_index): href = None if extra.get('format') == extras.FORMAT_IMAGE: content = extra.get('content') extra_kwargs = {} name = extra.get('name', None) if name: extra_kwargs = {'title': name} try: is_uri_or_path = (content.startswith(('file', 'http')) or isfile(content)) except ValueError: # On Windows, os.path.isfile throws this exception when # passed a b64 encoded image. is_uri_or_path = False if is_uri_or_path: if self.self_contained: warnings.warn('Self-contained HTML report ' 'includes link to external ' 'resource: {}'.format(content)) html_div = html.a(html.img(src=content, **extra_kwargs), href=content) elif self.self_contained: src = 'data:{0};base64,{1}'.format(extra.get('mime_type'), content) html_div = html.img(src=src, **extra_kwargs) else: if PY3: content = b64decode(content.encode('utf-8')) else: content = b64decode(content) href = src = self.create_asset(content, extra_index, test_index, extra.get('extension'), 'wb') if extra.get('lazy', False): extra_attrs = [ ' {}="{}"'.format(key, value) for key, value in extra_kwargs.items() ] img = raw( '<img class="lazy" data-original="{}"{} />'.format( src, "".join(extra_attrs))) else: img = html.img(src=src, **extra_kwargs) html_div = html.a(img, href=href, target="_new") self.additional_html.append(html.div(html_div, class_='image')) elif extra.get('format') == extras.FORMAT_HTML: self.additional_html.append(html.div(raw( extra.get('content')))) elif extra.get('format') == extras.FORMAT_JSON: content = json.dumps(extra.get('content')) if self.self_contained: href = data_uri(content, mime_type=extra.get('mime_type')) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_TEXT: content = extra.get('content') if isinstance(content, bytes): content = content.decode('utf-8') if self.self_contained: href = data_uri(content) else: href = self.create_asset(content, extra_index, test_index, extra.get('extension')) elif extra.get('format') == extras.FORMAT_URL: href = extra.get('content') if href is not None: self.links_html.append( html.a(extra.get('name'), class_=extra.get('format'), href=href, target='_blank')) self.links_html.append(' ')