如何在Selenium中单击加载更多按钮直到页面结束python?

时间:2019-07-15 07:18:55

标签: python selenium selenium-webdriver webdriver webdriverwait

使用硒进行加载和分页,需要单击“加载更多”按钮,但无法执行此操作。

尝试过:

from selenium import webdriver
import pandas as pd
driver = webdriver.Chrome('/Users/1/chromedriver.exe')
driver.get('https://simpletire.com/catalog?select=1&brand=61&query=catalog')

driver.find_element_by_css_selector(".btn.btn-primary.btn-lg").click();

尝试了上述操作,但单击了按钮,并且有更多的加载方式,如何多次加载它们,直到页面结束

错误:

试图使其保持循环但得到:

element not interactable

3 个答案:

答案 0 :(得分:1)

要对文本为加载更多结果的元素进行click(),则需要为所需的element_to_be_clickable()引入 WebDriverWait ,然后可以使用跟随Locator Strategies

  • 代码块A:

    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
    
    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument("start-maximized")
    # chrome_options.add_argument('disable-infobars')
    driver = webdriver.Chrome(options=chrome_options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://simpletire.com/catalog?select=1&brand=61&query=catalog")
    while True:
        try:
            # WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary btn-lg']//span[@class='glyphicon glyphicon-play']"))).click()
            WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Load More Results')]"))).click()
            print("LOAD MORE RESULTS button clicked")
        except TimeoutException:
            print("No more LOAD MORE RESULTS button to be clicked")
            break
    driver.quit()
    
  • 代码块B:

    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
    from selenium.webdriver.common.action_chains import ActionChains
    
    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument("start-maximized")
    # chrome_options.add_argument('disable-infobars')
    driver = webdriver.Chrome(options=chrome_options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://simpletire.com/catalog?select=1&brand=61&query=catalog")
    while True:
        try:
            # ActionChains(driver).move_to_element(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary btn-lg']//span[@class='glyphicon glyphicon-play']")))).pause(3).click().perform()
            ActionChains(driver).move_to_element(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[contains(., 'Load More Results')]")))).pause(5).click().perform()
            print("LOAD MORE RESULTS button clicked")
        except TimeoutException:
            print("No more LOAD MORE RESULTS button to be clicked")
            break
    driver.quit()
    
  • 控制台输出:

    LOAD MORE RESULTS button clicked
    LOAD MORE RESULTS button clicked
    LOAD MORE RESULTS button clicked
    LOAD MORE RESULTS button clicked
    LOAD MORE RESULTS button clicked
    .
    .
    .
    
  • 浏览器快照:

LOAD MORE RESULTS

答案 1 :(得分:1)

这是应该起作用的代码。我不确定有多少轮胎可用,脚本成功运行以加载约1000个结果。

我可以选择在满足轮胎计数后停止加载,而是重复100次以上。

url = 'https://simpletire.com/catalog?select=1&brand=61&query=catalog'
driver.get(url)
loadingButton = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//div[@id='load_button']")))
maxTires = 200;
while loadingButton:
    loadingButton.click()
    time.sleep(2)
    WebDriverWait(driver,30).until(EC.presence_of_element_located((By.XPATH,"//div[@id='is_loading'][contains(@style,'none')]")))
    loadElems = driver.find_elements_by_xpath("//div[@id='load_button'][contains(@style,'block')]")
    if len(loadElems)>0:
        loadingButton = driver.find_element_by_xpath("//div[@id='load_button'][contains(@style,'block')]")
        tiresLoaded = len(driver.find_elements_by_css_selector(".catResultWrapper.result"))
    else:
        print("Loaded all the tires")
        break
    if tiresLoaded >= maxTires:
        print (tiresLoaded + " are loaded successfully.")
        break

答案 2 :(得分:0)

对我有用的解决方案有点简单,需要一点努力,但是效果很好。

count=20
while count>1:
    button=driver.find_element_by_css_selector("button.ipl-load-more__button")
    button.click()
    count-=1
    time.sleep(2)
//do you work once all the pages are loaded

您唯一需要担心的是设置正确的计数值,如果它太小,您可能会引发错误,只需捕获它并根据您的要求增加/减少计数值即可。希望对您有所帮助。