Python Selenium单击进入下一页,直到进入最后一页

Python Selenium单击进入下一页,直到进入最后一页,python,selenium,selenium-webdriver,web-scraping,selenium-chromedriver,Python,Selenium,Selenium Webdriver,Web Scraping,Selenium Chromedriver,我一直试图点击下一页,每次都将表格数据附加到csv文件中,然后当我到达最后一页时,附加表格数据并中断while循环 不幸的是,由于某种原因,它一直停留在最后一页,我尝试了几种不同的方法来捕捉错误 while True: try : WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click() except : print("No more pa

我一直试图点击下一页,每次都将表格数据附加到csv文件中,然后当我到达最后一页时,附加表格数据并中断while循环

不幸的是,由于某种原因,它一直停留在最后一页,我尝试了几种不同的方法来捕捉错误

while True:
  try :
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()
  except :
      print("No more pages left")
      break
driver.quit()
我也试过这个:

try:
    link = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'.pagination-next a')))
    driver.execute_script('arguments[0].scrollIntoView();', link)
    link.click()
except:
    keep_going = False
我试着把打印的语句放进去,但它一直停留在最后一页

这是“下一步”按钮的第一页/最后一页的HTML,我不确定是否可以利用这一点: 第一页的HTML:

<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next" style=""><a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="">Next</a></li>
    <a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="">Next</a>
</li>
  • 最后一页的HTML:

    <li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next disabled" style=""><a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="" disabled="disabled" tabindex="-1">Next</a></li>
        <a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="" disabled="disabled" tabindex="-1">Next</a>
    </li>
    

  • 使用do/while循环,只检查“disabled”类是否包含在要退出的下一个按钮的属性中,怎么样?(请原谅语法。我只是把它拼凑起来,还没有试过)


    xPath
    到按钮的路径是:

    //li[@class = 'pagination-next']/a
    
    因此,每次需要加载下一页时,您都可以单击此元素:

    next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
    next_page_btn.index(0).click()
    
    注意:您应该添加一个逻辑:

    while True:
        next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
        if len(next_page_btn) < 1:
            print("No more pages left")
            break
        else:
            # do stuff
    
    为True时:
    next_page_btn=driver.find_elements_by_xpath(“//li[@class='pagination next']/a”)
    如果len(下一页)小于1:
    打印(“不再剩下页面”)
    打破
    其他:
    #做事
    
    您可以按如下方式解决此问题

    “下一步”按钮将一直启用到最后一页,并将在最后一页中禁用

    因此,您可以创建两个列表来查找启用的按钮元素和禁用的按钮元素。在任何时间点,启用的元素列表或禁用的元素列表大小都将为一。因此,如果元素被禁用,则可以中断while循环,否则请单击“下一步”按钮

    我不熟悉python语法。因此,您可以转换下面的java代码,然后使用它。它肯定会工作

    代码:

        boolean hasNextPage=true;
    
        while(hasNextPage){
            List<WebElement> enabled_next_page_btn=driver.findElements(By.xpath("//li[@class='pagination-next']/a"));
            List<WebElement> disabled_next_page_btn=driver.findElements(By.xpath("//li[@class='pagination-next disabled']/a"));
    
            //If the Next button is enabled/available, then enabled_next_page_btn size will be one.
            // So,you can perform the click action and then do the action
            if(enabled_next_page_btn.size()>0){
                enabled_next_page_btn.get(0).click();
                hasNextPage=true;
            }else if(disabled_next_page_btn.size()>0){
                System.out.println("No more Pages Available");
                break;
            }
        }
    
    布尔hasNextPage=true;
    while(hastnextpage){
    列表启用的\u next\u page\u btn=driver.findElements(By.xpath(“//li[@class='pagination-next']/a”);
    列出已禁用的\u next\u page\u btn=driver.findElements(By.xpath(“//li[@class='pagination-next disabled']/a”);
    //如果“下一步”按钮已启用/可用,则启用的\u下一页\u btn大小将为1。
    //因此,您可以执行单击操作,然后执行该操作
    如果(已启用\u下一页\u btn.size()>0){
    已启用下一页获取(0)。单击();
    hasNextPage=true;
    }else if(禁用\u下一页\u btn.size()>0){
    System.out.println(“没有更多可用页面”);
    打破
    }
    }
    
    下一页索引(0).click()不起作用,但检查下一页的长度可以确定它是否是最后一页,所以我可以这样做

    while True:
        next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
        if len(next_page_btn) < 1:
            print("No more pages left")
            break
        else:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()
    
    为True时:
    next_page_btn=driver.find_elements_by_xpath(“//li[@class='pagination next']/a”)
    如果len(下一页)小于1:
    打印(“不再剩下页面”)
    打破
    其他:
    WebDriverWait(驱动程序,10)。直到(EC.元素可点击((By.LINK\u TEXT,'Next'))。点击()
    

    非常感谢你的帮助

    将其转换为python,我认为它不起作用。。。添加一些打印语句以查看发生了什么。。。谢谢你的帮助
    while True:
        next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
        if len(next_page_btn) < 1:
            print("No more pages left")
            break
        else:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()