コード例 #1
0
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')
コード例 #2
0
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')
コード例 #3
0
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')
コード例 #4
0
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()
コード例 #5
0
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()
コード例 #6
0
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()
コード例 #7
0
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()
コード例 #8
0
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')
コード例 #9
0
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')
コード例 #10
0
def goToUrl(url:str):
    global driver
    ulog('%s'%url)
    driver.get(url)
    waitUntil(isReadyState)
コード例 #11
0
def getTextA(elm:WebElement)->str:
    waitUntil(lambda: elm.is_displayed() and elm.text,30,1)
    return elm.text
コード例 #12
0
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')
コード例 #13
0
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')