How to use restore_backup method in tempest

Best Python code snippet using tempest_python

EPGSaveLoadConfiguration.py

Source:EPGSaveLoadConfiguration.py Github

copy

Full Screen

1from __future__ import print_function2# for localized messages3from . import _4# GUI (Screens)5from Screens.Screen import Screen6from Screens.MessageBox import MessageBox7from Screens.ChoiceBox import ChoiceBox8from Components.ConfigList import ConfigListScreen9from Components.Harddisk import harddiskmanager10from Components.MenuList import MenuList11# GUI (Summary)12from Screens.Setup import SetupSummary13# GUI (Components)14from Components.ActionMap import ActionMap15from Components.Sources.StaticText import StaticText16from Tools.Directories import resolveFilename, SCOPE_PLUGINS, fileExists17# Configuration18from Components.config import config, configfile, getConfigListEntry, NoSave, ConfigSelection19import os20from enigma import eTimer, getDesktop, eEPGCache21import time22HD = False23if getDesktop(0).size().width() >= 1280:24 HD = True25class EPGSaveLoadConfiguration(Screen, ConfigListScreen):26 if HD:27 skin = """<screen name="EPGSaveLoadConfiguration" position="center,center" size="600,640">28 <ePixmap position="0,5" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />29 <ePixmap position="140,5" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />30 <widget source="key_red" render="Label" position="0,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />31 <widget source="key_green" render="Label" position="140,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />32 <widget source="epgcachelocation" render="Label" position="5,495" size="590,50" zPosition="1" font="Regular;21" halign="left" valign="center" />33 <widget name="config" position="5,50" size="590,428" scrollbarMode="showOnDemand" />34 <ePixmap pixmap="skin_default/div-h.png" position="0,490" zPosition="1" size="600,2" />35 <ePixmap pixmap="skin_default/div-h.png" position="0,550" zPosition="1" size="600,2" />36 <widget source="help" render="Label" position="5,555" size="590,83" font="Regular;21" />37 </screen>"""38 else:39 skin = """<screen name="EPGSaveLoadConfiguration" position="center,center" size="600,520">40 <ePixmap position="0,5" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />41 <ePixmap position="140,5" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />42 <widget source="key_red" render="Label" position="0,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />43 <widget source="key_green" render="Label" position="140,5" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />44 <widget source="epgcachelocation" render="Label" position="5,375" size="590,50" zPosition="1" font="Regular;21" halign="left" valign="center" />45 <widget name="config" position="5,50" size="590,315" scrollbarMode="showOnDemand" />46 <ePixmap pixmap="skin_default/div-h.png" position="0,370" zPosition="1" size="600,2" />47 <ePixmap pixmap="skin_default/div-h.png" position="0,430" zPosition="1" size="600,2" />48 <widget source="help" render="Label" position="5,435" size="590,83" font="Regular;21" />49 </screen>"""50 def __init__(self, session):51 Screen.__init__(self, session)52 self.setup_title = _("Configuration save / load EPG")53 self.onChangedEntry = []54 self.prev_lastepgcachepath = config.misc.epgcache_filename.value55 self.current_epgpath = config.plugins.epgrefresh_extra.epgcachepath.value56 self.list = [57 getConfigListEntry(_("Save EPG"), config.plugins.epgrefresh_extra.manual_save, _("Manually save EPG to current cache file.")),58 getConfigListEntry(_("Load EPG"), config.plugins.epgrefresh_extra.manual_load, _("Manually load EPG from current cachefile.")),59 getConfigListEntry(_("Clear EPG"), config.plugins.epgrefresh_extra.delete_backup, _("Manually clear EPG (choose method).")),60 getConfigListEntry(_("Reload EPG"), config.plugins.epgrefresh_extra.manual_reload, _("Manually load EPG from current cache file.")),61 getConfigListEntry(_("Restore EPG backup"), config.plugins.epgrefresh_extra.restore_backup, _("Manually restore EPG from backup cache file.")),62 getConfigListEntry(_("Automatically save EPG"), config.plugins.epgrefresh_extra.cachesavesched, _("Enable automatic EPG save interval.")),63 getConfigListEntry(_("Automatic save period (in hours)"), config.plugins.epgrefresh_extra.cachesavetimer, _("Configure EPG save interval, if enabled.")),64 getConfigListEntry(_("Automatically load EPG"), config.plugins.epgrefresh_extra.cacheloadsched, _("Automatic EPG loading from current cache file.")),65 getConfigListEntry(_("Automatic load period (in hours)"), config.plugins.epgrefresh_extra.cacheloadtimer, _("Configure EPG load interval, if enabled. This is an option for experienced users.")),66 getConfigListEntry(_("EPG cache file path"), config.plugins.epgrefresh_extra.epgcachepath, _("Select the path to EPG cache file. Don't use the internal flash if not necessary!")),67 getConfigListEntry(_("EPG cache file filename"), config.plugins.epgrefresh_extra.epgcachefilename, _("Select the file name for the EPG cache file.")),68 getConfigListEntry(_("Create backup when saving EPG"), config.plugins.epgrefresh_extra.save_backup, _("Create a backup cache file, after manually or automatically saving EPG.")),69 getConfigListEntry(_("Automatically restore EPG backup on boot"), config.plugins.epgrefresh_extra.autorestore_backup, _("Load EPG from backup cache file when booting.")),70 getConfigListEntry(_("Show entry 'Manually change EPG' in main menu"), config.plugins.epgrefresh_extra.main_menu, _("Restart enigma2 to effectuate.")),71 getConfigListEntry(_("Show entry 'AutoZap' in extensions menu"), config.plugins.epgrefresh_extra.show_autozap, _("Enable automatic zapping of all services in the current services list.")),72 getConfigListEntry(_("Duration to show each service (in seconds) for 'AutoZap'"), config.plugins.epgrefresh_extra.timeout_autozap, _("This is the duration each service will be shown in AutoZap mode.")),73 ]74 ConfigListScreen.__init__(self, self.list, session = session, on_change = self.changed)75 def selectionChanged():76 if self["config"].current:77 self["config"].current[1].onDeselect(self.session)78 self["config"].current = self["config"].getCurrent()79 if self["config"].current:80 self["config"].current[1].onSelect(self.session)81 for x in self["config"].onSelectionChanged:82 x()83 self["config"].selectionChanged = selectionChanged84 self["config"].onSelectionChanged.append(self.updateHelp)85 self["key_red"] = StaticText(_("Cancel"))86 self["key_green"] = StaticText(_("OK"))87 self["epgcachelocation"] = StaticText()88 self["help"] = StaticText()89 self["actions"] = ActionMap(["SetupActions", "ColorActions"],90 {91 "cancel": self.keyCancel,92 "save": self.keySave,93 "ok": self.keyOK,94 }95 )96 self.updateDestination()97 self.changed()98 self.onLayoutFinish.append(self.setCustomTitle)99 def setCustomTitle(self):100 self.setTitle(self.setup_title)101 def updateDestination(self):102 file_infos = ""103 if os.path.exists(config.misc.epgcache_filename.value):104 from os import stat as os_stat105 try:106 file_stats = os_stat(config.misc.epgcache_filename.value)107 file_infos = _("Size: ") + str(self.Humanizer(file_stats.st_size)) + " "108 except:109 file_infos = " "110 epgcachelocationlabel = _("Current EPG cachefile:") + " " + config.misc.epgcache_filename.value + "\n" + file_infos111 self["epgcachelocation"].setText(epgcachelocationlabel)112 def Humanizer(self, size):113 if (size < 1024):114 humansize = str(size)+" B"115 elif (size < 1048576):116 humansize = str(size/1024)+" KB"117 else:118 humansize = str(size/1048576)+" MB"119 return humansize120 def updateHelp(self):121 cur = self["config"].getCurrent()122 if cur:123 self["help"].text = cur[2]124 def keyOK(self):125 ConfigListScreen.keyOK(self)126 sel = self["config"].getCurrent()[1]127 if sel == config.plugins.epgrefresh_extra.manual_save:128 self.session.openWithCallback(self.setEpgSave, MessageBox,_("Are you sure you want to save the EPG cache to:\n") + config.misc.epgcache_filename.value, MessageBox.TYPE_YESNO)129 if sel == config.plugins.epgrefresh_extra.manual_load:130 self.session.openWithCallback(self.setEpgLoad, MessageBox,_("Are you sure you want to load the EPG data from:\n") + config.misc.epgcache_filename.value, MessageBox.TYPE_YESNO)131 if sel == config.plugins.epgrefresh_extra.manual_reload:132 self.session.openWithCallback(self.setEpgReload, MessageBox,_("Are you sure you want to save and load the EPG data from:\n") + config.misc.epgcache_filename.value, MessageBox.TYPE_YESNO)133 if sel == config.plugins.epgrefresh_extra.restore_backup:134 restore_backup = config.misc.epgcache_filename.value + ".backup"135 if os.path.exists(restore_backup):136 try:137 os.system("cp -f %s %s" % (restore_backup, config.misc.epgcache_filename.value ))138 os.chmod("%s" % (config.misc.epgcache_filename.value), 0644)139 self.setEpgLoad(True)140 self.setEpgSave(True)141 if os.path.exists(config.misc.epgcache_filename.value):142 self.session.open(MessageBox, _("Backup file load!"), MessageBox.TYPE_INFO, timeout = 4)143 else:144 try:145 os.system("rm -f %s" % (restore_backup))146 self.session.open(MessageBox, _("Backup file is corrupt!\nBackup file will be deleted!"), MessageBox.TYPE_INFO, timeout = 4)147 except:148 pass149 self.updateDestination()150 except:151 pass152 else:153 self.session.open(MessageBox, _("Backup file is not found!"), MessageBox.TYPE_INFO, timeout = 4)154 if sel == config.plugins.epgrefresh_extra.epgcachepath:155 self.setEPGCachePath()156 if sel == config.plugins.epgrefresh_extra.delete_backup:157 self.deleteEPG()158 def setEPGCachePath(self):159 inhibitDirs = ["/autofs", "/bin", "/boot", "/dev", "/lib", "/proc", "/sbin", "/sys", "/tmp", "/usr"]160 from Screens.LocationBox import LocationBox161 txt = _("Input EPG Cache path")162 self.session.openWithCallback(self.setEPGCachePathBack, LocationBox, text=txt, currDir=config.plugins.epgrefresh_extra.epgcachepath.value,163 bookmarks=config.plugins.epgrefresh_extra.bookmarks, autoAdd=False, editDir=True, minFree=20, inhibitDirs=inhibitDirs)164 def setEPGCachePathBack(self, res):165 if res is not None:166 config.plugins.epgrefresh_extra.epgcachepath.value = res167 def deleteEPG(self):168 menu = [(_("Clear only in memory (RAM) EPG"), "ram"),(_("Clear only epg.dat and epg.dat.backup"), "dat"),(_("Clear all EPG"), "all")]169 def removeEPGAction(choice):170 if choice is not None:171 try:172 epgcache = eEPGCache.getInstance()173 if choice[1] == "ram":174 if hasattr(epgcache, 'flushEPG'):175 epgcache.flushEPG()176 elif choice[1] == "dat":177 restore_backup = config.misc.epgcache_filename.value + ".backup"178 os.system("rm -f %s" % (restore_backup))179 os.system("rm -f %s" % (config.misc.epgcache_filename.value))180 elif choice[1] == "all":181 if hasattr(epgcache, 'flushEPG'):182 epgcache.flushEPG()183 restore_backup = config.misc.epgcache_filename.value + ".backup"184 os.system("rm -f %s" % (restore_backup))185 os.system("rm -f %s" % (config.misc.epgcache_filename.value))186 self.updateDestination()187 except:188 pass189 self.session.openWithCallback(removeEPGAction, ChoiceBox, title= _("Select action:"), list=menu)190 def setEpgSave(self, answer):191 if answer:192 epgcache = eEPGCache.getInstance()193 epgcache.save()194 self.updateDestination()195 if config.plugins.epgrefresh_extra.save_backup.value and config.plugins.epgrefresh_extra.epgcachepath.value != "/etc/enigma2/":196 restore_backup = config.misc.epgcache_filename.value + ".backup"197 if os.path.exists(config.misc.epgcache_filename.value):198 try:199 os.system("cp -f %s %s" % (config.misc.epgcache_filename.value, restore_backup))200 os.chmod("%s" % (restore_backup), 0644)201 except:202 pass203 def setEpgLoad(self, answer):204 if answer:205 epgcache = eEPGCache.getInstance()206 epgcache.load()207 def setEpgReload(self, answer):208 if answer:209 epgcache = eEPGCache.getInstance()210 epgcache.save()211 epgcache = eEPGCache.getInstance()212 epgcache.load()213 self.updateDestination()214 if config.plugins.epgrefresh_extra.save_backup.value and config.plugins.epgrefresh_extra.epgcachepath.value != "/etc/enigma2/":215 restore_backup = config.misc.epgcache_filename.value + ".backup"216 if os.path.exists(config.misc.epgcache_filename.value):217 try:218 os.system("cp -f %s %s" % (config.misc.epgcache_filename.value, restore_backup))219 os.chmod("%s" % (restore_backup), 0644)220 except:221 pass222 def changed(self):223 for x in self.onChangedEntry:224 try:225 x()226 except Exception:227 pass228 def getCurrentEntry(self):229 return self["config"].getCurrent()[0]230 def getCurrentValue(self):231 return str(self["config"].getCurrent()[1].getText())232 def createSummary(self):233 return SetupSummary234 def cancelConfirm(self, result):235 if not result:236 return237 for x in self["config"].list:238 x[1].cancel()239 self.close()240 def keyCancel(self):241 if self["config"].isChanged():242 self.session.openWithCallback(243 self.cancelConfirm,244 MessageBox,245 _("Really close without saving settings?")246 )247 else:248 self.close()249 def updateEpgCache(self):250 config.misc.epgcache_filename.setValue(os.path.join(config.plugins.epgrefresh_extra.epgcachepath.value, config.plugins.epgrefresh_extra.epgcachefilename.value.replace(".dat","") + ".dat"))251 config.misc.epgcache_filename.save()252 configfile.save()253 if self.prev_lastepgcachepath != config.misc.epgcache_filename.value:254 eEPGCache.getInstance().setCacheFile(config.misc.epgcache_filename.value)255 eEPGCache.getInstance().save()256 self.updateDestination()257 if config.plugins.epgrefresh_extra.save_backup.value and config.plugins.epgrefresh_extra.epgcachepath.value != "/etc/enigma2/":258 restore_backup = config.misc.epgcache_filename.value + ".backup"259 if os.path.exists(config.misc.epgcache_filename.value):260 try:261 os.system("cp -f %s %s" % (config.misc.epgcache_filename.value, restore_backup))262 os.chmod("%s" % (restore_backup), 0644)263 except:264 pass265 def keySave(self):266 if config.plugins.epgrefresh_extra.cachesavesched.value or config.plugins.epgrefresh_extra.cacheloadsched.value:267 if fileExists("/usr/lib/enigma2/python/Plugins/Extensions/EPGD/plugin.py"):268 try:269 same_options = config.plugins.epgd.autosave.value270 except:271 same_options = False272 if same_options:273 if config.plugins.epgd.autosave.value != "0":274 self.session.open(MessageBox, _("The same functions are used in plugin EPGD!!"), MessageBox.TYPE_INFO)275 config.plugins.epgrefresh_extra.cachesavesched.value = False276 config.plugins.epgrefresh_extra.cacheloadsched.value = False277 return278 try:279 same_options = config.epg.cacheloadsched.value or config.epg.cachesavesched.value280 except:281 same_options = False282 if same_options:283 self.session.open(MessageBox, _("The same functions are used in Menu -> System -> EPG settings!"), MessageBox.TYPE_INFO)284 config.plugins.epgrefresh_extra.cachesavesched.value = False285 config.plugins.epgrefresh_extra.cacheloadsched.value = False286 return287 for x in self["config"].list:288 x[1].save()289 self.updateEpgCache()290 if self.prev_lastepgcachepath != config.misc.epgcache_filename.value:291 if os.path.exists(self.prev_lastepgcachepath):292 try:293 os.remove(self.prev_lastepgcachepath)294 except:295 pass296 restore_backup = self.prev_lastepgcachepath + ".backup"297 if os.path.exists(restore_backup):298 try:299 os.remove(restore_backup)300 except:301 pass302 self.close()303class ManualEPGlist(Screen):304 skin = """305 <screen position="center,center" size="380,140" title="%s">306 <widget name="list" position="5,5" size="370,130" />307 </screen>""" % _("Select options")308 def __init__(self, session):309 Screen.__init__(self, session)310 self.session = session311 self["list"] = MenuList([])312 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.close}, -1)313 self.onLayoutFinish.append(self.showMenu)314 def showMenu(self):315 list = []316 list.append(_("Manually save EPG"))317 list.append(_("Manually load EPG"))318 list.append(_("Manually reload EPG"))319 list.append(_("Configuration..."))320 self["list"].setList(list)321 def okClicked(self):322 sel = self["list"].getCurrent()323 if sel == _("Manually save EPG"):324 self.session.openWithCallback(self.manualsetEpgSave, MessageBox,_("Are you sure you want to save the EPG cache to:\n") + config.misc.epgcache_filename.value, MessageBox.TYPE_YESNO)325 if sel == _("Manually load EPG"):326 self.session.openWithCallback(self.manualsetEpgLoad, MessageBox,_("Are you sure you want to load the EPG data from:\n") + config.misc.epgcache_filename.value, MessageBox.TYPE_YESNO)327 if sel == _("Manually reload EPG"):328 self.session.openWithCallback(self.manualsetEpgReload, MessageBox,_("Are you sure you want to save and load the EPG data from:\n") + config.misc.epgcache_filename.value, MessageBox.TYPE_YESNO)329 if sel == _("Configuration..."):330 self.session.open(EPGSaveLoadConfiguration)331 def manualsetEpgSave(self, answer):332 if answer:333 epgcache = eEPGCache.getInstance()334 epgcache.save()335 self.setBackup()336 def manualsetEpgLoad(self, answer):337 if answer:338 epgcache = eEPGCache.getInstance()339 epgcache.load()340 def manualsetEpgReload(self, answer):341 if answer:342 epgcache = eEPGCache.getInstance()343 epgcache.save()344 epgcache = eEPGCache.getInstance()345 epgcache.load()346 self.setBackup()347 def setBackup(self):348 if config.plugins.epgrefresh_extra.save_backup.value and config.plugins.epgrefresh_extra.epgcachepath.value != "/etc/enigma2/":349 restore_backup = config.misc.epgcache_filename.value + ".backup"350 if os.path.exists(config.misc.epgcache_filename.value):351 try:352 os.system("cp -f %s %s" % (config.misc.epgcache_filename.value, restore_backup))353 os.chmod("%s" % (restore_backup), 0644)354 except:...

Full Screen

Full Screen

DETECTION_STEP_1_V6.py

Source:DETECTION_STEP_1_V6.py Github

copy

Full Screen

1## V12## V2 3## V3: read txt. better filter weather degree4## V4: removed step for loading final las and all mentions of las or lmp in scripts5## V5: removed steps to save marker files and moved 'clear mrk files' to the end of each script.6## V6: combine V4 and V5. Fixed some bugs7import pywinauto, xlrd, re, time, os, warnings8from time import sleep9from pywinauto.timings import wait_until10from pywinauto.keyboard import send_keys11from pywinauto.application import Application12warnings.filterwarnings("ignore")13##app = Application(backend="win32").start("C:\\Program Files (x86)\\PLS\\pls_cadd\\pls_cadd64.exe")14app = Application(backend="win32").start("C:\\Program Files\\PLS\\pls_cadd\\pls_cadd64.exe")15os.system('cls' if os.name == 'nt' else 'clear')16try:17 app.about_PLS_CADD.OK.click18except:19 pass20app.Dialog.OK.click()21## Gather input values22## Reading info from Veg_Detection_Command.txt23fname='C:\\Scripts\\Veg_Detection_Command.txt'24f = open(fname)25text = []26for line in f:27 text.append(line[:-1])28processDir=text[1]29#processGroup=sheet.cell_value(6,1)30#LineID=str(int(sheet.cell_value(7,1)))31#Kv=str(int(sheet.cell_value(8,1)))32#print("File Path:"+processDir,"Processing Group:"+processGroup,"LineID is "+LineID,"Line KV is "+Kv+"Kv")33#NAME=LineID+"_"+Kv+"kv"34#FINAL_LAS_PATH=text[7]35#FINAL_LAS_PATH=FINAL_LAS_PATH[:-1]36#print(FINAL_LAS_PATH)37BAK_PATH=text[3]38#BAK_PATH=BAK_PATH[:-1]39#print(BAK_PATH)40#FINAL_LAS=text[9]41#FINAL_LAS=FINAL_LAS[:-1]42#print(FINAL_LAS)43BAK=text[5]44#BAK=BAK[:-1]45## Open bak file46app.PLS_CADD_Project_wizard.Restore_Project_from_PLS_CADD_Backup_file.click()47app.PLS_CADD_Project_wizard.OK.click()48#app.PLS_CADD.menu_select("File->Restore_Backup")49#app[u'Restore_Backup']['File_name:Edit'].set_text(processDir+processGroup+"\\"+NAME+"_qsi2018_detections.bak") #201950app[u'Restore_Backup']['File_name:Edit'].set_text(BAK_PATH+"\\"+BAK+".bak") 51sleep(2.0)52app.window(best_match='Restore_Backup', top_level_only=True).child_window(best_match='Open').click()53sleep(2.0)54#app[u'Restore_Backup']['Open'].click()55app.Directory_Mapping_For_Restore.Quick_Restore.click()56sleep(1.0)57app[u'Select_Directory_To_Restore_Files_In']['File_name:Edit'].set_text(BAK_PATH)58sleep(1.0)59#app[u'Select_Directory_To_Restore_Files_In']['Select_Folder'].click()60app.window(best_match='Select_Directory_To_Restore_Files_In', top_level_only=True).child_window(best_match='Select_Folder').double_click()61#send_keys('{ENTER}')62app.PLS_CADD.OK.click()63try:64 app.PLS_CADD.OK.click65except:66 pass67try:68 #app[u'Restore_Backup_Of_'+NAME+'_qsi2018_veg_detections_bak']['Always'].click()69 app.top_window().Always.click()70except:71 pass72#app.restore_backup.wait_not('visible', timeout=100)73app.restore_backup.wait_not('exists', timeout=1000)74#app[u'Restore_Backup_Of_'+BAK+".bak"].wait('ready',timeout=30)75sleep(2.0)76app[u'Restore_Backup_Of_'+BAK+".bak"]['Yes'].click()77app.Calculating_terrain_stations_and_offsets.wait_not('exists', timeout=6000)78app.Calculating_terrain_stations_and_offsets.wait_not('exists', timeout=6000)79app.checking_xyz_data.wait_not('exists', timeout=6000)80sleep(2.0)81## 3D view and TIN82app.top_window().menu_select("Window-> 4 3D view")83app.top_window().menu_select("Terrain-> TIN-> Display options")84app.Ground_TIN_Display_Options.render_triangles.check()85app.Ground_TIN_Display_Options.OK.click()...

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run tempest automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful