Selenium以编程方式单击下一个按钮,直到最后一页

时间:2018-05-25 06:56:29

标签: python selenium web-scraping

嗨,我是网络抓取的新手,并且一直在尝试使用Selenium在python中抓取forum

我想让Selenium单击“下一步”直到最后一页,但我不知道如何打破循环。我在定位器上遇到了麻烦:

当我通过部分链接找到下一个按钮时,自动点击将继续到下一个帖子,例如page1-> page2-> next thread-> page1 of next thread - >下一个主题的第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. 我应该使用哪个定位器? (按类或部分链接或任何 其他建议?
  2. 如何打破循环,使其在到达时停止点击 最后一页?

3 个答案:

答案 0 :(得分:0)

  1. 您可以使用任何提供唯一标识的定位器。最佳实践说明了以下顺序。

    • 编号
    • 名称
    • 班级名称
    • Css选择器
    • Xpath的
    • 其他
  2. 当找不到你可以使用的元素时,在while循环中出现try block,如下所示。 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
    

答案 1 :(得分:0)

您需要考虑以下几点:

  • 页面上有两个元素,其中上一页一个位于顶部,另一个位于底部,因此您需要决定您希望与哪个元素进行交互并构建一个独特的Locator Strategy
  • 向前移动,因为您想要在元素上调用click()而不是 expected-conditions 作为presence_of_element_located(),您需要使用element_to_be_clickable()
  • 当没有包含下一步的文字元素时,您需要执行其余步骤,因此请在 click() 块中调用try-catch并且有例外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
    

答案 2 :(得分:0)

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

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