【问题标题】:Selenium clicking to next page until on last pageSelenium 点击下一页直到最后一页
【发布时间】:2018-12-08 02:17:34
【问题描述】:

我试图继续点击此website 的下一页,每次将表格数据附加到 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>

【问题讨论】:

    标签: python selenium selenium-webdriver web-scraping selenium-chromedriver


    【解决方案1】:

    如何使用 do/while 循环并检查“禁用”类是否包含在下一个按钮的属性中以退出? (请原谅语法。我只是把它放在一起并没有尝试过)

    string classAttribute
    
    try :
    
         do
         {
              IWebElement element = driver.findElement(By.LINK_TEXT("Next"))
              classAttribute = element.GetAttribute("class")
              element.click()
         }
         while(!classAttribute.contains("disabled"))
    
    except :
    
         pass
    
    driver.quit()
    

    【讨论】:

    • 已将其转换为 python,但我认为它不起作用...添加一些打印语句以查看发生了什么...谢谢您的帮助
    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      你可以解决如下问题,

      下一个按钮将在最后一页启用,在最后一页将被禁用。

      因此,您可以创建两个列表来查找启用的按钮元素和禁用的按钮元素。在任何时候,启用的元素列表或禁用的元素列表大小都将为一。所以,如果元素被禁用,那么您可以中断 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;
              }
          }
      

      【讨论】:

        【解决方案4】:

        next_page_btn.index(0).click() 不起作用,但是检查 next_page_btn 的 len 可以确定它是否是最后一页,所以我能够做到这一点。

        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()
        

        非常感谢您的帮助!

        【讨论】:

          猜你喜欢
          • 2023-01-20
          • 2020-07-05
          • 1970-01-01
          • 2018-11-04
          • 1970-01-01
          • 2013-10-29
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多