def modelWalker(): global driver, prevTrail, modelName rootUrl = 'http://www2.zyxel.com/us/en/support/DownloadLandingSR.shtml?c=us&l=en&md=' try: startIdx = getStartIdx() ulog('len(allModels)=%d' % len(allModels)) for idx in range(startIdx, len(allModels)): ulog('idx=%s' % idx) modelName = allModels[idx] ulog('modelName="%s"' % modelName) goToUrl(rootUrl + parse.quote(modelName)) waitUntil(isReadyState) # click "Firmware" tab tab = elemWithText('li.resp-tab-item', 'Firmware') if not tab: ulog('no Firmware tab,bypass!') prevTrail += [idx] upsertOneModel() prevTrail.pop() continue tab.click() time.sleep(0.1) prevTrail += [idx] versionWalker() prevTrail.pop() except Exception as ex: ipdb.set_trace() traceback.print_exc() driver.save_screenshot(getScriptName() + '_' + getFuncName() + '_excep.png')
def modelWalker(): global driver,prevTrail CSS=driver.find_element_by_css_selector CSSs=driver.find_elements_by_css_selector try: retryA(lambda:CSS(mkts[prevTrail[-1]]).click()) models = CSSs('#newboxes%d a'%(prevTrail[-1]+1)) numModels=len(models) ulog('numModels=%s'%numModels) startIdx = getStartIdx() for idx in range(startIdx,numModels): waitUntil(lambda: models[idx].is_displayed(),5) if not models[idx].text: ulog('bypass idx=%s'%idx) continue ulog('enter %s,"%s"'%(idx,models[idx].text)) prevTrail+=[idx] retryA(lambda: models[idx].click()) fileWalker() prevTrail.pop() waitUntil(isReadyState) retryA(lambda:CSS(mkts[prevTrail[-1]]).click()) models = CSSs('#newboxes%d a'%(prevTrail[-1]+1)) assert numModels == len(models) except Exception as ex: ipdb.set_trace() traceback.print_exc() driver.save_screenshot(getScriptName()+'_'+getFuncName()+'_exc.png')
def modelWalker(): global driver, prevTrail, modelName rootUrl='http://www2.zyxel.com/us/en/support/DownloadLandingSR.shtml?c=us&l=en&md=' try: startIdx = getStartIdx() ulog('len(allModels)=%d'%len(allModels)) for idx in range(startIdx,len(allModels)): ulog('idx=%s'%idx) modelName=allModels[idx] ulog('modelName="%s"'%modelName) goToUrl(rootUrl+parse.quote(modelName)) waitUntil(isReadyState) # click "Firmware" tab tab = elemWithText('li.resp-tab-item','Firmware') if not tab: ulog('no Firmware tab,bypass!') prevTrail+=[idx] upsertOneModel() prevTrail.pop() continue tab.click() time.sleep(0.1) prevTrail+=[idx] versionWalker() prevTrail.pop() except Exception as ex: ipdb.set_trace() traceback.print_exc() driver.save_screenshot(getScriptName()+'_'+getFuncName()+'_excep.png')
def modelWalker(): global driver, prevTrail, models act=ActionChains(driver) CSSs = driver.find_elements_by_css_selector try: startIdx = getStartIdx() for idx, model in enumerate(models[startIdx:],len(models)): ulog('idx=%s, model="%s"'%(idx,model)) goToUrl(rootUrl) btn=waitClickable('.search-select button') act.move_to_element(btn).click(btn).perform() inp=waitClickable('.input-block-level') act.move_to_element(inp).click(inp).perform() act.send_keys(model + Keys.DOWN + Keys.ENTER).perform() time.sleep(0.1) waitUntil(isReadyState) ulog('url='+driver.current_url) title = waitText('.lightGrayBg > div > div > div > h2') ulog('title='+title) # 'Search by Model Number' or 'No Matches Found' if title.startswith('No Matches Found'): continue prevTrail+=[idx] tabWalker() prevTrail.pop() except Exception as ex: ipdb.set_trace() traceback.print_exc()
def modelWalker(): global driver, prevTrail, models act = ActionChains(driver) CSSs = driver.find_elements_by_css_selector try: startIdx = getStartIdx() for idx, model in enumerate(models[startIdx:], len(models)): ulog('idx=%s, model="%s"' % (idx, model)) goToUrl(rootUrl) btn = waitClickable('.search-select button') act.move_to_element(btn).click(btn).perform() inp = waitClickable('.input-block-level') act.move_to_element(inp).click(inp).perform() act.send_keys(model + Keys.DOWN + Keys.ENTER).perform() time.sleep(0.1) waitUntil(isReadyState) ulog('url=' + driver.current_url) title = waitText('.lightGrayBg > div > div > div > h2') ulog('title=' + title) # 'Search by Model Number' or 'No Matches Found' if title.startswith('No Matches Found'): continue prevTrail += [idx] tabWalker() prevTrail.pop() except Exception as ex: ipdb.set_trace() traceback.print_exc()
def rowWalker(): global driver, prevTrail try: rows = driver.find_elements_by_css_selector('table.blueTable:nth-child(1) tr') waitUntil(lambda:all(_.is_displayed() for _ in rows)) rows = [_ for _ in rows if _.text.startswith('Firmware')] numRows = len(rows) startIdx = getStartIdx() for idx in range(startIdx, numRows): ulog('row idx=%s'%idx) if not rows[idx].text.startswith('Firmware\n'): continue prevTrail += [idx] versionWalker(rows[idx]) prevTrail.pop() except Exception as ex: ipdb.set_trace() traceback.print_exc()
def rowWalker(): global driver, prevTrail try: rows = driver.find_elements_by_css_selector( 'table.blueTable:nth-child(1) tr') waitUntil(lambda: all(_.is_displayed() for _ in rows)) rows = [_ for _ in rows if _.text.startswith('Firmware')] numRows = len(rows) startIdx = getStartIdx() for idx in range(startIdx, numRows): ulog('row idx=%s' % idx) if not rows[idx].text.startswith('Firmware\n'): continue prevTrail += [idx] versionWalker(rows[idx]) prevTrail.pop() except Exception as ex: ipdb.set_trace() traceback.print_exc()
def modelWalker(): global driver,prevTrail try: models = getElems('.list ul li a') numModels=len(models) ulog('numModels=%s'%numModels) startIdx = getStartIdx() for idx in range(startIdx,numModels): modelName = models[idx].text ulog('enter %s,"%s"'%(idx,modelName)) prevTrail+=[idx] models[idx].click() waitUntil(lambda:len(driver.window_handles)==2) driver.switch_to.window(driver.window_handles[-1]) revisionWalker() prevTrail.pop() models = getElems('.list ul li a') except Exception as ex: ipdb.set_trace() traceback.print_exc() driver.save_screenshot(getScriptName()+'_'+getFuncName()+'_exc.png')
def revisionWalker(): global driver,prevTrail try: try: dropdown=waitVisible('#dlDropDownBox dd:nth-child(2) p span',9,0.4) except (TimeoutException,NoSuchElementException): prevTrail+=[0] ulog('no revision dropdown, trail=%s'%prevTrail) fileWalker() prevTrail.pop() driver.close() driver.switch_to.window(driver.window_handles[-1]) return dropdown.click() revs = getElems('#dlDropDownBox dd ul li a') waitUntil(lambda: all(_.is_displayed() for _ in revs)) waitUntil(lambda: ulog('revs=%s'% [_.text for _ in revs])>=0) numRevs = len(revs) startIdx=getStartIdx() for idx in range(startIdx,numRevs): rev=revs[idx] prevTrail+=[idx] ulog('click "%s",trail=%s'%(rev.text,prevTrail)) rev.click() fileWalker() prevTrail.pop() dropdown=waitVisible('#dlDropDownBox dd:nth-child(2) p span',3,0.4) dropdown.click() revs = getElems('#dlDropDownBox dd ul li a') waitUntil(lambda: all(_.is_displayed() for _ in revs)) driver.close() driver.switch_to.window(driver.window_handles[-1]) return except Exception as ex: ipdb.set_trace() traceback.print_exc() driver.save_screenshot(getScriptName()+'_'+getFuncName()+'_exc.png')
def goToUrl(url:str): global driver ulog('%s'%url) driver.get(url) waitUntil(isReadyState)
def getTextA(elm:WebElement)->str: waitUntil(lambda: elm.is_displayed() and elm.text,30,1) return elm.text
def fileWalker(): global driver,prevTrail try: waitUntil(isReadyState) prodName=waitText('#prodname') ulog('prodName="%s"'%prodName) modelName = waitText('#prodmodel') ulog('modelName="%s"'%modelName) # click "Support" retryA(lambda: elemWithText('li.tab-link', 'Support').click()) # expand "Downloads" waitClickable('div.accordion-section:nth-child(2) a').click() pageUrl=driver.current_url # select tables try: tables = getElems('table.supp',9,1) except TimeoutException: tables=None if not tables: ulog('no firmware download for "%s"'%modelName) trailStr=str(prevTrail) sql("INSERT OR REPLACE INTO TFiles (model,product_name," "page_url,tree_trail) VALUES" "(:modelName, :prodName," ":pageUrl,:trailStr)",glocals()) ulog('UPSERT "%(modelName)s", "%(prodName)s", '%glocals()) driver.back() return files = getElems('table.supp tr') startIdx = getStartIdx() numFiles=len(files) ulog('numFiles=%s'%numFiles) bUpserted=False for idx in range(startIdx, numFiles): try: col=files[idx].find_element_by_css_selector('td:nth-child(1)') except NoSuchElementException: ulog('bypass idx=%s'%idx) continue fwDate=guessDate(col.text) if not fwDate: ulog('bypass idx=%s'%idx) continue desc=files[idx].find_element_by_css_selector('td:nth-child(2)') fwDesc=desc.text fileName=desc.find_element_by_css_selector('a') ulog('fileName.text="%s"'%fileName.text) if 'firmware' not in fileName.text.lower(): ulog('bypass idx=%s'%idx) continue fwVer = guessVersion(fileName.text) fileUrl=fileName.get_attribute('href') fwDesc=desc.text.strip() trailStr=str(prevTrail+[idx]) ulog('trail=%s'%trailStr) sql("INSERT OR REPLACE INTO TFiles (model,product_name," "fw_date, fw_ver, fw_desc, " "page_url,file_url,tree_trail) VALUES" "(:modelName, :prodName," ":fwDate,:fwVer,:fwDesc," ":pageUrl,:fileUrl,:trailStr)",glocals()) ulog('UPSERT "%(modelName)s", "%(prodName)s", "%(fwDate)s", ' ' "%(fwVer)s", %(fileUrl)s'%glocals()) bUpserted=True if not bUpserted: trailStr=str(prevTrail) sql("INSERT OR REPLACE INTO TFiles (model,product_name," "page_url,tree_trail) VALUES" "(:modelName, :prodName," ":pageUrl,:trailStr)",glocals()) ulog('UPSERT "%(modelName)s", "%(prodName)s", '%glocals()) driver.back() return except Exception as ex: ipdb.set_trace() traceback.print_exc() driver.save_screenshot(getScriptName()+'_'+getFuncName()+'_exc.png')
def selectSoftwareType(): """ This page would be jumped to versionWalker() or either jumped back to treeWalker forward: may auto jump backward: not auto jump """ global startTrail,prevTrail,driver try: waitText('.csProductSelectorBreadcrumb', 5, 1) waitUntilStable('.csProductSelectorBreadcrumb', 1, 0.3) depth = getDepth() jumpedLevels =depth - len(prevTrail) ulog('jumpedLevels=%d'%jumpedLevels) assert jumpedLevels>=0 ulog('depth=%d, but prevTrail=%s'%(depth, prevTrail)) startIdxFromStartTrail=False def getStartIdx()->int: if startTrail: nonlocal startIdxFromStartTrail startIdxFromStartTrail=True return startTrail.pop(0) else: return 0 if jumpedLevels>0: while depth>len(prevTrail): startIdx=getStartIdx() prevTrail+=[startIdx] else: startIdx=getStartIdx() assert depth==len(prevTrail) ulog('startTrail=%s'%startTrail) ulog('prevTrail=%s'%prevTrail) ulog('startIdx=%d'%startIdx) ulog('url=%s'%driver.current_url) crumbs = waitText('.csProductSelectorBreadcrumb') uprint('crumbs=%s'%(crumbs.replace('\n',' > '))) if not hasElem('table#imageTableContainer', 1.5,0.4): if jumpedLevels>0: startIdx=getStartIdx() if depth > len(prevTrail): prevTrail+=[startIdx] sdpBannerTitle=waitText('td.SDPBannerTitle').strip() ulog('SDBBannerTitle="%s"'%sdpBannerTitle) assert sdpBannerTitle.lower().startswith('select ') waitUntil(lambda: getNumElem('div.csWrapper li a') > 0) swtypes = getElems('div.csWrapper li a') ulog('%s'%[(i,getElemText(_)) for i,_ in enumerate(swtypes)]) numSwTypes=len(swtypes) assert numSwTypes > 0 for idx in range(startIdx, numSwTypes): ulog('goto Trail=%s'%(prevTrail+[idx])) swtypes = getElems('div.csWrapper li a') ulog('Click "%s"'% getElemText(swtypes[idx])) clickElem(swtypes[idx]) prevTrail+=[idx] selectSoftwareType() prevTrail.pop() # Select a Product -> Select a Software type -> Select a Platform # https://software.cisco.com/download/type.html?mdfid=277873153&flowid=170&softwareid=283724313 # Downloads Home >Products >Cisco Interfaces and Modules >WAN Interface Cards >1700/2600/3600/3700 Series 2-Port Analog Modem WAN Interface Card >Analog Firmware Loader >Windows 2000-v6780 # not auto back to treeWalker # go back manually crumbs = getElems('.csProductSelectorBreadcrumb a') ulog('manually backto "%s"'%getElemText(crumbs[-1])) ulog('prevTail=%s'%prevTrail) clickElem(crumbs[-1]) # do I need to pop prevTrail? # prevTrail.pop() else: ulog('auto forward to versionWalker') if startIdxFromStartTrail: startTrail.insert(0, startIdx) for i in range(jumpedLevels): if not startTrail: break startTrail.pop(0) versionWalker() for i in range(jumpedLevels): crumbs = getElems('.csProductSelectorBreadcrumb a') ulog('manually backto "%s"'%getElemText(crumbs[-1])) ulog('prevTail=%s'%prevTrail) clickElem(crumbs[-1]) prevTrail.pop() except Exception as ex: ipdb.set_trace() print(ex); traceback.print_exc() driver.save_screenshot('cisco_selectSoftwareType.png')