Нажатие кнопки «Больше» через селен - PullRequest
0 голосов
/ 14 октября 2018

Я пытаюсь очистить следующий веб-сайт: https://angel.co/companies

Внизу есть кнопка "Еще", которая при нажатии загружает больше записей.

Мне нужно нажать на кнопкукнопка через селен.

Я попробовал следующее:

python_button = driver.find_elements_by_class_name("more")
python_button.click()

Однако соответствующая кнопка не найдена, т.е. мой python_button возвращает пустой список.

Я пыталсяследующее:

python_button = driver.find_element_by_class_name("more")

И это дает следующую ошибку:

Сообщение: нет такого элемента: Невозможно найти элемент: {"method": "class name", "selector ":" more "}

Есть идеи, как обойти это?

Ответы [ 3 ]

0 голосов
/ 14 октября 2018

Вы делаете правильно, просто подождите немного.Ajax срабатывает после обратного вызова селена.Вы можете написать что-то вроде этого или использовать «assert»:

button = None
while not button:
    button = driver.find_element_by_class_name("more")
    if button:
        break

Вы также можете попробовать использовать ajaxes вместо selenium.Попробуйте этот параметр страницы изменения URL:

https://angel.co/companies/startups?ids[]=81494&ids[]=3322647&ids[]=98145&ids[]=32119&ids[]=21604&ids[]=19935&ids[]=480579&ids[]=3062473&ids[]=431924&ids[]=395542&ids[]=154&ids[]=948481&ids[]=197974&ids[]=891681&ids[]=972236&ids[]=686564&ids[]=115616&ids[]=515341&ids[]=1856&ids[]=477880&total=4381226&page=3&sort=signal&new=false&hexdigest=be1927797c1b88f79ae42efd4180ea78d3e9e711

Посмотрите, веб-сайт возвращает файл json со словарем из одного ключа - "html", это возвращение серверов htmlcode.

0 голосов
/ 14 октября 2018

Чем больше вы нажмете кнопку MORE , тем больше данных будет загружено.Вам нужно заставить WebDriverWait для кнопки с текстом с MORE нажимать , и вы можете использовать следующее решение:

  • Блок кода:

    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.common.exceptions import TimeoutException
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://angel.co/companies")
    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='more' and contains(.,'More')]")))
    while True:
        try:
            WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='more' and contains(.,'More')]"))).click()
            print("MORE button clicked")
        except TimeoutException:
            break
    driver.quit()
    
  • Выход на консоль:

    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    MORE button clicked
    
0 голосов
/ 14 октября 2018

Я пробовал то же самое, используя Java.Пожалуйста, добавьте явное / свободное ожидание перед проверкой размера списка.Пожалуйста, найдите ниже код.

driver.get("https://angel.co/companies");
    new WebDriverWait(driver, 30).pollingEvery(Duration.ofMillis(100)).withTimeout(Duration.ofSeconds(30))
            .until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.more")));
    List<WebElement> elements = driver.findElements(By.cssSelector("div.more"));
    System.out.println(elements.size());
...