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,实现模拟点击网页下一页按钮,抓取网页数据