Selenium通过编程点击下一个按钮,直到最后一页

70gysomp  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(246)

你好,我是一个新的网页抓取,并一直在尝试使用Selenium在python中抓取一个forum
我试图让Selenium点击“下一步”,直到最后一页,但我不知道如何打破循环。我有问题的定位器:
当我通过部分链接找到“下一个”按钮时,自动单击将继续到下一个线程,例如page 1-〉page 2-〉下一个线程-〉下一个线程的page 1--〉下一个线程的page 2

while True:
    next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Next")))
    next_link.click()

当我通过类名找到下一个按钮时,自动单击将在到达最后一页时单击“上一个”按钮

while True:
    next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
    next_link.click()

我的问题是:
1.我应该使用哪个定位器?(按类还是按部分链接或任何其他建议?)
1.如何中断循环,使其在到达最后一页时停止单击?

twh00eeo

twh00eeo1#

有几件事你需要考虑如下:

  • 页面上有两个文本为Next的元素,一个在 Top,另一个在 Bottom,因此您需要确定要与哪个元素交互并构建唯一的定位器策略
  • 如果您希望在元素上调用click(),而不是将 expected-conditions 作为presence_of_element_located(),则需要使用element_to_be_clickable()
  • 当没有元素的文本为Next时,您需要执行剩余的步骤,因此在**try-catch**块内调用click(),以防break出现异常。
  • 根据您的要求,我认为将xpath作为 * 定位器策略 * 是合适的。
  • 下面是工作代码块:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_argument('disable-infobars')
driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
driver.get("https://forums.hardwarezone.com.sg/money-mind-210/hdb-fully-paid-up-5744914.html")
driver.find_element_by_xpath("//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a").click()
while True:
    try :
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a[contains(.,'Next')]"))).click()
    except :
        print("No more pages left")
        break
driver.quit()
  • 控制台输出:
No more pages left
k7fdbhmy

k7fdbhmy2#

您可以使用以下代码单击“下一步”按钮,直到到达最后一页,如果该按钮不存在,则中断循环:

from selenium.common.exceptions import TimeoutException

while True:
    try:
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next ›"))).click()
    except TimeoutException:
        break
ghhaqwfi

ghhaqwfi3#

  • 您可以使用任何提供唯一识别的储位。最佳作法的顺序如下。
  • 识别码
  • 名称名称名称
  • 类别名称
  • CSS选择器
  • X路径
  • 其他
  • 当循环中没有找到元素时,可以使用下面给出的try块。break命令也是如此。
while True:
    try:
        next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
        next_link.click()
    except TimeoutException:
        break

相关问题