class GalenTestBase(unittest.TestCase): def setUp(self): self.driver = GalenRemoteWebDriver("http://localhost:4444/wd/hub", desired_capabilities=DesiredCapabilities.CHROME) def tearDown(self): if self.driver: self.driver.quit() def test_check_layout(self, test_name, specs, included_tags, excluded_tags): try: test_report = TestReport(test_name) check_layout_report = Galen().check_layout(self.driver, os.path.join(os.path.dirname(__file__) + "/" + "specs/" + specs), included_tags, excluded_tags) test_report.add_report_node(info_node("Running layout check for: " + test_name) .with_node(warn_node('this is just an example')) .with_node(error_node('to demonstrate reporting'))) \ .add_layout_report_node("check " + specs, check_layout_report).finalize() if check_layout_report.errors > 0: raise AssertionError( "Incorrect layout: " + test_name + " - Number of errors " + str(check_layout_report.errors)) except Exception as e: raise e
class GalenTestBase(unittest.TestCase): def __init__(self, methodName='runTest'): super(GalenTestBase, self).__init__(methodName) def setUp(self): self.driver = GalenRemoteWebDriver( "http://localhost:4444/wd/hub", desired_capabilities=DesiredCapabilities.CHROME) def tearDown(self): if self.driver: self.driver.quit() def check_layout(self, test_name, specs, included_tags, excluded_tags): try: parent_dir = os.path.abspath( os.path.join(os.path.dirname(__file__) + '/..')) test_report = TestReport(test_name) check_layout_report = Galen().check_layout( self.driver, os.path.join(parent_dir, "test", "specs", specs), included_tags, excluded_tags) test_report.add_report_node(info_node("Running layout check for: " + test_name) .with_node(warn_node('this is just an example')) .with_node(error_node('to demonstrate reporting'))) \ .add_layout_report_node("check " + specs, check_layout_report).finalize() if check_layout_report.errors > 0: raise AssertionError("Incorrect layout: " + test_name + " - Number of errors " + str(check_layout_report.errors)) except Exception as e: raise e
def post(self, request): """ Accept post method """ contexts = dict() if request.user.is_authenticated(): print(request.POST) page_url = request.POST.get('page_url') mac_res = request.POST.get('mac_res') win_res = request.POST.get('win_res') screenshot_quality = request.POST.get('screenshot_quality') browsers = request.POST.getlist('browsers') build_uuid = request.POST.get('build_uuid', None) project_uuid = request.POST.get('project_uuid', None) form_spec_file = request.FILES.get('spec_file', None) data = list() print(browsers) if form_spec_file is None: contexts.update({ 'status': 400, 'message': 'Galen spec file must be present in request.' }) return JsonResponse(contexts) print('Check existent of project') if project_uuid is not None and project_uuid != '': print('Project presented') try: project = Project.objects.get(project_uuid=project_uuid, owner__id=request.user.id) print('Query project done') print('Create spec file record') spec = SpecFile(filename=form_spec_file.name, project=project, spec_file=form_spec_file) spec.save() print('Saved spec file record') print('Start Checking Layout') print(spec.spec_file.url) tmpdir = tempfile.mkdtemp( dir=os.path.join(settings.BASE_DIR, 'tmp')) tmp_spec_filename = 'testing_specfile.spec' full_tmp_spec = os.path.join(tmpdir, tmp_spec_filename) response = urllib.urlretrieve(spec.spec_file.url) contents = open(response[0]).read() with open(full_tmp_spec, 'w') as f: f.write(contents) except ObjectDoesNotExist as e: contexts.update({ 'status': 404, 'message': 'Oop! ' + e.message }) return JsonResponse(contexts) except OSError: if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update({ 'status': 500, 'message': 'Oop! OS error' }) return JsonResponse(contexts) except IOError: if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update({ 'status': 500, 'message': 'Oop! IO error' }) return JsonResponse(contexts) except: if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update({ 'status': 500, 'message': 'Oop! something went wrong, please try again.' }) return JsonResponse(contexts) print('Check existent of build') if build_uuid is not None and build_uuid != '': print('Build presented') try: build = TestBuild.objects.get( build_uuid=build_uuid, project__project_uuid=project_uuid, project__owner__id=request.user.id) print('Query build done') except ObjectDoesNotExist as e: if full_tmp_spec: os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update({ 'status': 404, 'message': 'Oop! ' + e.message }) return JsonResponse(contexts) except: if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update({ 'status': 500, 'message': 'Oop! something went wrong, please try again.' }) return JsonResponse(contexts) else: print('Count existing build of project') build_count = TestBuild.objects.filter( project=project).count() try: build = TestBuild(name='Build Version ' + str(build_count + 1), project=project) print('Saving build') build.save() print('New Build created') except: if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update({ 'status': 500, 'message': 'Oop! something went wrong while create build, please try again' }) return JsonResponse(contexts) else: contexts.update({ 'status': 300, 'message': 'Project must be specified in request.' }) return JsonResponse(contexts) print('Start loop browsers') browser_error_count = 0 for browser in browsers: print('Test Browser => ' + browser) origin_browser_name = browser os_platform, os_version, browser, device_or_browser_version, is_mobile = str( browser).split('|') test_title = origin_browser_name.replace('|', ' ') session_report_name = str(origin_browser_name).replace( '|', ' ').replace(' ', '-').replace('.', '-').lower() operation_failed_flag = False browser_data = dict() if is_mobile == '1': desired_cap = { 'os': str(os_platform).upper(), 'os_version': str(os_version), 'browser': browser, 'device': str(device_or_browser_version), 'acceptSslCerts': True, 'browserstack.video': False } else: desired_cap = { 'os': str(os_platform).upper(), 'os_version': str(os_version), 'browser': browser, 'browser_version': str(device_or_browser_version), 'acceptSslCerts': True, 'browserstack.video': False } print('Starting Galen remote driver') driver = GalenRemoteWebDriver( remote_url=settings.BS_API_HUB_URL, desired_capabilities=desired_cap) session_uuid = driver.session_id print('Go to page => ' + page_url) driver.get(page_url) driver.maximize_window() try: print("SPEC FILE PATH => " + full_tmp_spec) check_layout = Galen().check_layout( driver, full_tmp_spec, [], []) print('Finished check layout') TestReport(test_title).add_layout_report_node( test_title, check_layout).finalize() print('Finished finalize report') print('Generating report path') report_path = '{}/{}/{}/'.format(project_uuid, build.build_uuid, session_report_name) full_report_path = os.path.join(settings.GALEN_REPORT_DIR, report_path) print('Starting generate galen report') generate_galen_report(full_report_path) print('Galen report generated') session = TestSession(title=test_title, build=build, project=project, session_uuid=session_uuid, status='SUCCESS') print('Saving session') session.save() print('session saved') print('Updating build status') build.status = 'SUCCESS' build.save() print('Updated build status') print('Create report record') g_report = GalenReport(title=test_title + ' > ' + build.name, report_dir=report_path, project=project, build=build, session=session) print('Saving report record') g_report.save() print('Report record saved') print('Starting serialize report') serialized_report = serializers.serialize( 'json', [ g_report, ], fields=('report_uuid', 'title', 'report_dir', 'project', 'build', 'session')) print('Starting serialize session') serialized_session = serializers.serialize( 'json', [ session, ], fields=('title', 'build', 'project', 'session_uuid')) print('Create browser response data') browser_data.update({ 'status': 200, 'title': test_title, # 'project': { # 'project_uuid': project.project_uuid, # 'name': project.project_name # }, # 'build': { # 'uuid': build.build_uuid, # 'name': build.name # }, 'session': serialized_session, 'report': serialized_report, 'screenshots': [] }) print('Finished Browser Test') except FileNotFoundError: contexts.update({ 'status': 500, 'message': 'Oop! spec file import error, file not found!' }) browser_data.update({ 'status': 500, 'title': test_title, 'message': test_title + ' browser test is failed, due to spec file not found' }) browser_error_count += 1 operation_failed_flag = True except IllegalMethodCallException as e: contexts.update({ 'status': 500, 'message': 'Oop! ' + e.message }) browser_data.update({ 'status': 500, 'title': test_title, 'message': test_title + ' browser test is failed, due to illegal method call.' }) browser_error_count += 1 operation_failed_flag = True except: contexts.update({ 'status': 500, 'message': 'Oop! something went wrong, while testing via remote driver.' }) browser_data.update({ 'status': 500, 'title': test_title, 'message': test_title + ' browser test is failed.' }) browser_error_count += 1 finally: print('HEY : Quit Browser') data.append(browser_data) driver.quit() # Close Galen jar file driver.thrift_client.shut_service() if operation_failed_flag: if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) contexts.update( {'browser_error_count': browser_error_count}) return JsonResponse(contexts) pass contexts.update({ 'status': 200, 'message': 'Automate Cross browser testing finished.', 'data': data, 'browser_error_count': browser_error_count }) if 'full_tmp_spec' in locals(): os.remove(full_tmp_spec) os.rmdir(tmpdir) return JsonResponse(contexts) else: contexts.update({ 'status': 403, 'message': 'Authentication Failed.' }) return JsonResponse(contexts)