MoveTargetOutOfBoundsException - Python Веб-парсинг - PullRequest
0 голосов
/ 05 августа 2020

Веб-сайт, который я пытаюсь очистить, имеет большую часть содержимого, отображаемого с помощью аккордеонов. Я идентифицировал закрытые аккордеоны по имени класса "chevron-svg.left.chevron-down". Я бы хотел открыть их все, всего 81.

Я пробовал использовать scrollIntoView, но получаю ошибку MoveTargetOutOfBoundsException. Как лучше всего это сделать? Я видел, как люди рекомендуют WebDriverWait, но я не уверен, как это реализовать.

Мой код приведен ниже, был бы очень признателен за совет о том, что я делаю неправильно. Сайт и html также ниже на скриншоте.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

url = "https://sports.ladbrokes.com/event/basketball/american/nba/portland-trail-blazers-v-houston-rockets/230811255/all-markets"
driver = webdriver.Safari()
driver.maximize_window()
driver.get(url)

WebDriverWait(driver, 30).until(EC.element_to_be_clickable((By.CLASS_NAME, "chevron-svg.left.chevron-down")))
elements = driver.find_elements_by_class_name("chevron-svg.left.chevron-down")

for element in elements:
    driver.execute_script("arguments[0].scrollIntoView();", element)
    ActionChains(driver).move_to_element(element).click().perform()

Website

HTML

1 Ответ

1 голос
/ 05 августа 2020

После некоторого тестирования я обнаружил, что проблема заключается в навигационной панели: вы прокручиваете слишком низко с помощью «прокрутки до элемента», а щелчок перехватывается навигационной панелью. Чтобы исправить это, я просто добавил scrollBy в ваш скрипт. По сути, замените execute_script("arguments[0].scrollIntoView();", element) на execute_script("arguments[0].scrollIntoView(); window.scrollBy(0, -200);", element)

Кроме того, я не знаю, почему вы не используете element.click() вместо ActionChains(driver).move_to_element(element).click().perform(), отлично работает для меня.

My тестовая функция была:

def test(url = URL_test):
    driver = webdriver.Chrome(options=chrome_options,
                              executable_path=Path('chromedriver.exe'))
    driver.maximize_window()
    try:
        driver.get(url)
        time.sleep(5) # wait for load, too lazy to do proper way
        elements = driver.find_elements_by_class_name("chevron-svg.left.chevron-down")
        for element in elements:
            header = element.find_element_by_xpath('../div[contains(@class, "accordion-")]/span[1]').text
            print(header) # to test which ones fail
            driver.execute_script("arguments[0].scrollIntoView(); window.scrollBy(0, -200);", element)
            element.click()
    except Exception as e:
        print(e)
        driver.save_screenshot("screenshot1.png")
        pass
    return driver
...