Selenium 点击下一页直到最后一页

Posted

技术标签:

【中文标题】Selenium 点击下一页直到最后一页【英文标题】:Selenium clicking to next page until on last page 【发布时间】: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>

【问题讨论】:

【参考方案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()

非常感谢您的帮助!

【讨论】:

以上是关于Selenium 点击下一页直到最后一页的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个硒直到结束才点击“下一页”?

selenium webdriver学习,选择模块,点击下一页,获取当前url

Selenium WebElement.Click() 是不是等到加载下一页?

python下用selenium的webdriver包如何在执行完点击下一页后获得下一页新打开页面的html源代码呢?

python下用selenium的webdriver包如何在执行完点击下一页后没有获得下一页新打开页面的html源代码

使用selenium webdriver+beautifulsoup+跳转frame,实现模拟点击网页下一页按钮,抓取网页数据