【问题标题】:How can I make Selenium click on the "Next" button until it is no longer possible?我怎样才能让 Selenium 点击“下一步”按钮,直到它不再可能?
【发布时间】:2015-05-04 11:30:44
【问题描述】:

我想写一段代码,让Python在一个页面上抓取一些数据,然后点击页面底部的“下一步”按钮,在第二页抓取一些数据,点击“下一步”按钮等,直到最后一页,无法再点击“下一步”(因为没有“下一步”)。

我想让代码尽可能通用,而不是事先指定要完成的点击次数。 在这个问题(How can I make Selenium click through a variable number of "next" buttons?)之后,我有下面的代码。 Python 不报告任何错误,但程序在第一次迭代后停止(第一次单击“下一步”后)。

我在这里缺少什么?非常感谢!

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()

【问题讨论】:

    标签: python selenium selenium-webdriver while-loop pagination


    【解决方案1】:

    我会创建一个无休止的 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" 的元素不在页面上或不可点击。

    【讨论】:

    • 谢谢!我认为它会起作用,而且更简单,我喜欢。我的问题是由于其他原因(下一个和上一个按钮之间的类名重复),所以一旦我解决了这个问题,我就应该开始工作了。再次感谢!
    • Me again... 所以“下一个”和“上一个”按钮具有相同的类名等。它们唯一的区别在于 span 对象中的文本。我知道如何访问该文本: wait.until(EC.text_to_be_present_in_element((By.XPATH, "//div[@id='reviews_pagination_pair_container']"),'Next')) .... 但是我应该如何整合这对上面的代码,以便 Selenium 仅当“next”在 span 对象中时才运行“element.click()”? (我知道,基本循环问题,但不知何故,我今天无法让它工作)TIA
    • @anne_t xpath 怎么样,像这样//*[contains(@class, "reviews_pagination_link_nav")]//span[. = "Next"]?
    • @anne_t 猜测,因为我没有看到实际的 html :)
    • 谢谢,我现在就试试。这是 html 的相关部分(与“上一个”按钮完全相同,除了 span 中的文本: 下一个>>
    猜你喜欢
    • 1970-01-01
    • 2022-01-10
    • 2017-08-20
    • 1970-01-01
    • 2018-12-06
    • 2021-05-29
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多