如何使Selenium单击“下一步”按钮,直到不再可用?


问题内容

我想编写一个代码,使Python在页面上抓取一些数据,然后单击页面底部的“下一个”按钮,在第二页上抓取一些数据,单击“下一个”按钮,依此类推。直到最后一页,再也无法单击“下一步”(因为没有“下一步”)。

我想使代码尽可能通用,而不是事先指定要完成的点击次数。遵循这个问题(如何使Selenium单击可变数量的“下一步”按钮?),我得到了下面的代码。Python没有报告任何错误,但是程序在第一次迭代后停止(在第一次单击“ next”之后)。

我在这里想念什么?非常感谢!

driver = webdriver.Firefox()
driver.get("http://www.mywebsite_example.com")
try:
    wait = WebDriverWait(driver, 100)
    wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'reviews_pagination_link_nav')))    
    driver.find_element_by_class_name("reviews_pagination_link_nav").click()

    wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'reviews_pagination_link_nav')))
    while EC.element_to_be_clickable((By.CLASS_NAME,'reviews_pagination_link_nav')):
      driver.find_element_by_class_name("reviews_pagination_link_nav").click()
      if not driver.find_element_by_class_name("reviews_pagination_link_nav"):
        break
      wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'reviews_pagination_link_nav')))

finally:
    driver.quit()

问题答案:

我将进行一个无穷while True循环,并在TimeoutException抛出该循环后将其中断-这意味着没有剩余的页面了:

wait = WebDriverWait(driver, 10)
while True:
    # grab the data

    # click next link
    try:
        element = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'reviews_pagination_link_nav')))
        element.click()
    except TimeoutException:
        break

为此,您需要确保在单击最后一页后,带有的元素class="reviews_pagination_link_nav"不在页面上或不可单击。