def focus(): tc('focus on business console') g.wait20.until(EC.number_of_windows_to_be(2)) g.focus(1) #bc is an alt tab-window g.wait60.until( EC.presence_of_element_located( (By.XPATH, "//div[@id='stepSummaryTable']")))
def navtab (t='Overview'): """ nav tab: Overview|Stage Instances|Process Instances """ tc('nav tab '+t) g.wait.until(EC.element_to_be_clickable((By.XPATH, "//a[.='"+t+"']" )))\ .send_keys(Keys.RETURN)
def close(refresh=True): #sleep(5) #tmp so page seen on demo tc('close business console tab/window') g.driver.close() #close tab-window g.focus() refresh and g.driver.refresh() #it'd be stale overwise g.focus_main() #back to main window
def kpidetail(): """click kpi detail magglass link """ tc('click kpi detail magglass') x = "//a[contains (@href,':viewMonitor')]" g.wait.until(EC.element_to_be_clickable((By.XPATH, x))).send_keys(Keys.RETURN)
def deploy(d, a='Deploy All'): #a: Deploy Updates | Deploy All e = envid(d) tc('deploy env ' + e) x = "//*/a[contains (@href, 'environmentID=" + e + "&') and contains (@href, 'isDeployed=')]" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) tc('click ' + a) x = "//*[@value='" + a + "']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) tc('check deployment status') x = "//*/b[text()='Successfully deployed environment.']" g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) #may check just specific server deploy status #x="//*/textarea[@name='deployResult']"; e = g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) #print(e.get_attribute('value')); #assert 'Deployed logical server \"Analytic Engine v' in e.get_attribute('value') #focus on ok for one server tc('return to env list') x = "//*[@type='submit' and @value='Close']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) l = d.get('name', 'AAenv') tc('locate env link ' + l) g.wait.until(EC.element_to_be_clickable((By.LINK_TEXT, l)))
def validatepi(pid): """ validate instance details by pid """ tc('located pid=' + pid) g.wait20.until( EC.presence_of_element_located((By.XPATH, "//td[.='" + pid + "']")))
def exportenv(env): """export env.name for env.rel; ret exported filename""" e = env['name'] tc('export env ' + e) xe = "//*[text()='" + e + "']/preceding::td[1]/input" g.wait.until(EC.element_to_be_clickable((By.XPATH, xe))).click() import glob, os base = env['exp_dir'] + '/ExportedEnvironments' out = base + env['rel'] + '.xml' wildcard = base + '*.xml' before = glob.glob(wildcard) x = "//*[@value='Export Environment...']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) for i in range(0, 5): #process uploaded file time.sleep(1) for f in glob.glob(wildcard): #print(f) if f not in before: if os.path.isfile(out + '.bak'): os.remove(out + '.bak') if os.path.isfile(out): os.rename(out, out + '.bak') time.sleep(3) #file may be there but not finish download os.rename(f, out) #uncheck env so func can be called back to back g.wait.until(EC.element_to_be_clickable( (By.XPATH, xe))).click() return out raise Exception("exported file not found: " + wildcard)
def importenv(env={}): tc('import env ' + str(env)) x = "//*[@value='Import Environment...']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) g.wait.until(EC.number_of_windows_to_be(2)) g.focus(1) x = "//*/input[@name='uploadedFile']" e = g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) #remote - / local = \\ path separators! print(env['file']) e.send_keys(env['file']) x = ".//*/input[@value='OK']" handles = g.driver.window_handles #g.wait.until(EC.element_to_be_clickable((By.XPATH, x))).send_keys(Keys.RETURN) g.driver.find_element(By.XPATH, x).send_keys(Keys.RETURN) g.disappear(handles) #make sure import dialog closed if env.get('migrate', False): g.wait.until(EC.number_of_windows_to_be(2)) #migr dialog poped g.focus(1) x = ".//*/input[@value='Yes']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) g.wait.until(EC.number_of_windows_to_be(1)) #file upload dialog gone g.focus()
def finish(d): tc('click finish') x = "//*[@type='button' and @name='finish']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) x = "//*[@value='Add Environment...']" g.wait.until(EC.element_to_be_clickable((By.XPATH, x)))
def selectvolumes(d={'level': 'proc', 'range': 'curr', 'status': 'All'}): """ select volume for 3 different combos: {'level':'proc|step','range':'curr|prev','status:'All|Started|In Progress|Completed'} """ tc('select volume->' + d['level'] + '->' + d['range'] + '->' + d['status']) if d['range'] == 'curr': level = { 'step': ['stepVolumeValueText', 'step'], 'proc': ['volumeValueText', 'vol'] } else: level = { 'step': ['stepVolumePreviousValueText', 'stepPrevious'], 'proc': ['volumePreviousValueText', 'volPrevious'] } x = "//a[contains (@id, '" + level[d['level']][0] + "')]" # g.wait.until(EC.element_to_be_clickable((By.XPATH, x))).click() status = { 'All': 'TotalLink', 'Started': 'StartedLink', 'In Progress': 'InProgressLink', 'Completed': 'CompLink' } if d['level'] == 'step': status['Started'] = 'StartLink' status['In Progress'] = 'InProgLink' x = "//*/a[contains (@id, '" + level[d['level']][1] + status[ d['status']] + "')]" g.wait.until(EC.element_to_be_clickable((By.XPATH, x))).click() overlay()
def envnames(): """ret {name:id} - names from single/mult pages on env list except if blank list """ tc('get env names from list') x = "//span/a[contains(@href,'webm.apps.config.env?')] | //*[contains(text(),'No Environments Defined')]" e = g.wait.until(EC.visibility_of_all_elements_located((By.XPATH, x))) if "No Environments Defined" in e[0].text: return {} try: #reset to the 1st page o = g.driver.find_element(By.LINK_TEXT, '1') o.click() except: pass names = {} while True: g.wait.until(EC.visibility_of_all_elements_located((By.XPATH, x))) es = g.driver.find_elements_by_xpath(x) #print (len(es)) for e in es: #print(e.text, e.get_attribute('href')) id = re.search('.+environmentID=(\d+)', e.get_attribute('href')).group(1) names[e.text] = id try: o = g.driver.find_element(By.PARTIAL_LINK_TEXT, 'Next') o.click() g.wait.until(EC.staleness_of(o)) tc("jump to next page") except: break return names
def delete(l): """ del envs """ tc('del envs') if type(l) is str: l = [{'name': l}] if type(l) is dict: l = [l] x = "//*[@value='Add Environment...']" g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) for u in l: x = "//*[@type='checkbox' and @value='" + envid(u) + "']" e = g.driver.find_element(By.XPATH, x) u = u.get('name', 'AAenv') if g.FF: e.send_keys(Keys.SPACE) else: e.click() x = "//*[@type='button' and @value='Delete']" e = g.driver.find_element(By.XPATH, x) if e.is_enabled(): e.send_keys(Keys.RETURN) x = "//*[@value='Delete' and @name='submitbutton']" #time.sleep(2) msg = Alert(g.driver).text Alert(g.driver).accept() print('*deleted existing envs:', l) try: x = "//*/a[text() = '" + u + "']" e = g.driver.find_element(By.XPATH, x) print('*env still seen' + u) assert False, 'env steel seen!' except: print('*no env seen as expected ' + u) else: print('*no existing envs:', l)
def create(env): """ create ccs env; ret id """ before = envnames() tc('click add env btn') x = "//*[@value='Add Environment...']" g.wait.until(EC.element_to_be_clickable((By.XPATH, x))).\ send_keys(Keys.RETURN) tc('enter env name ' + env.get("name")) x = "//*[@name='environmentName']" e = g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) e.clear() e.send_keys(env.get('name')) tc('enter env desc' + env.get("desc")) e = g.driver.find_element(By.NAME, 'environmentDesc') e.clear() e.send_keys(env.get('desc')) tc('click save env button') e = g.driver.find_element(By.NAME, 'save').send_keys(Keys.RETURN) tc('check env is in list') for k, v in envnames().items(): if k not in before: env['id'] = v return raise Exception('failed lookup env id')
def navheadermenu(name): """ navigate header menu item @name """ tc('nav header menu -> ' + name) g.wait.until( EC.element_to_be_clickable( (By.XPATH, "//a[contains(@id,'" + name + "')]"))).click()
def finish(d): tc('click finish') x = "//*[@type='button' and @name='finish']" g.wait.until(EC.element_to_be_clickable( (By.XPATH, x))).send_keys(Keys.RETURN) l = d.get('name', 'AAenv') tc('locate env link ' + l) g.wait.until(EC.element_to_be_clickable((By.LINK_TEXT, l)))
def clickpi(ind='1'): """ click on ind'th proc inst link in table; ret: pid """ tc('click on pi link '+ind) e=g.wait.until(EC.element_to_be_clickable((By.XPATH, "//table[@id='processInstancesTable']//tr[@id='"+ind+"']/td[3]/a"))) e.click() return e.text
def magglass(p='0'): """ click magnifying glass link to BC """ tc('click on magnifying glass link for process ' + p) #handles all model type variations x = "//a[contains (@id, 'resultsTable:__row" + p + ":detail')]" e = g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) e.click()
def validateid(p): """ click on Process Instance ID link """ tc('validate instance ' + p) x = "//*/span[contains (@id, 'instanceId')]" t = g.wait.until(EC.visibility_of_element_located((By.XPATH, x))).text if t != p: tc('', 'fail')
def search(text): """ search for text in search widgets (almost in all) """ tc('search ' + text) g.wait.until(EC.element_to_be_clickable((By.XPATH,\ "//input[contains (@name,'keywordsTextInput')]"))).send_keys(text) g.wait.until(EC.element_to_be_clickable((By.XPATH,\ "//button[contains (@name,'impleSearchGoButton')]"))).click() m.overlay_handler()
def descriptionlink(i=0): """click on i-th problem desc link in problems table, ret: link descr """ tc('click on ' + str(i) + ' problem in problems list') x = "//a[contains (@href,':viewDetail')]" g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) l = g.driver.find_elements_by_xpath(x) t = l[i * 2].text l[i * 2].send_keys(Keys.RETURN) #every other link is magglass return t
def navenv(d=ccs): """ nav to env """ l = d.get('name', 'AAenv') tc('locate click env link ' + l) g.wait.until(EC.element_to_be_clickable( (By.LINK_TEXT, l))).send_keys(Keys.RETURN) x = "//*[@name='environmentName']" e = g.wait.until(EC.element_to_be_clickable((By.XPATH, x)))
def caf_error(): """check for caf errors @ret [caf error elements] """ #x = "//*[@class='caf-error-summary']" tc('check for caf errors') try: e = g.driver.find_elements_by_class_name('caf-error-summary') except: pass return e
def navconfig(c, click=True, index=0): """ nav to config @c on configure servers tab, @click on @index conf(there may be more than 1 on page) ret [] of configs named @c """ tc('nav/click/index: ' + c + '/' + str(click) + '/' + str(index)) g.wait.until(EC.element_to_be_clickable((By.LINK_TEXT, c))) e = g.driver.find_elements_by_link_text(c) if click: #click on index config name occurrence e[index].send_keys(Keys.RETURN) return e
def findsteps(): tc('find all steps on proc diagram') #select all step images //*/img[contains (@style,'cursor')] #select all step labels (which contain their names) x = "//*/img[contains (@style,'cursor')]/ancestor::div[2]/following-sibling::div[1]" es = g.driver.find_elements_by_xpath(x) steps = [] for s in es: steps.append(s.text) tc('found steps on proc diagram ' + str(len(steps))) return steps
def piidlink(p='0', click=True): """ click Process Instance ID link to BC, ret pid and may click link """ tc('click on instance ID link for process ' + p) #handles all model type variations x = "//a[contains (@id, 'resultsTable:__row" + p + ":instanceId')\ or contains (@id, 'resultsTable:__row" + p + ":processInstance')]" e = g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) click and e.click() return e.text
def checkexecution(p,s=True): """validate execution flag""" tc('check execution flag for model') x="//img[contains (@id,'executionEnabledIcon') and contains (@id,'"+p+"')]" se=g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) s0=se.get_attribute('src') if 'Icon_Configured.png' in s0: s0=True else: s0=False assert s is s0
def select_proc (name): """ select process in dropdown ret Select obj """ tc('select proc '+name) s=Select (g.wait.until(EC.element_to_be_clickable((By.XPATH, TP+"select[@id='processSelectList']")))) sleep(1) s.select_by_visible_text(name) return s
def clicksi(ind='1'): """ click on ind'th stage inst link in table; ret: pid """ tc('click on stage link '+ind) e=g.wait.until(EC.element_to_be_clickable((By.XPATH, "//table[@id='stageInstancesTable']//tr[@id='"+ind+"']//td[5]/a"))) text = e.text e.send_keys(Keys.RETURN) tc('returning '+text) return text
def search(text): """ search for text in search widgets like on Problems page """ tc('search ' + text) e = g.wait.until(EC.element_to_be_clickable((By.XPATH,\ "//input[@name='keywords']"))) e.clear() #input may retain e.send_keys(text) g.wait.until(EC.element_to_be_clickable((By.XPATH,\ "//input[@name='dosearch']"))).click() g.wait.until(EC.staleness_of(e))
def checkanalysis(p,s=True): """validate analysis flag""" tc('check analysis flag for model WMN-6416') x="//img[contains (@id,'analysisEnabledIcon') and contains (@id,'"+p+"')]" se=g.wait.until(EC.element_to_be_clickable((By.XPATH, x))) s0=se.get_attribute('src') #print(s0,'-----')''' if 'Icon_Configured.png' in s0: s0=True else: s0=False assert s is s0