EC.presence_of_element_located not и WebDriverWait приводит к ошибке «Другой элемент получил бы щелчок: ...» в селене для Python - PullRequest
0 голосов
/ 15 мая 2019

Навигация по веб-страницам (https://www.hertz.com/rentacar/location) отображается через JS. Установка time.sleep(random.randint(5, 10)) приводит к успешному щелчку элемента, в то время как моя функция waiter (см. Ниже) приводит к ошибке Other element would receive the click:.

Сценарий очищает все местоположения Герц в каждом городе в каждом штате США, успешно используя time.sleep перед каждым выбором и щелчком, но я считаю, что это плохая практика, и из-за снов для выполнения требуются многочисленные часы.

полный текст ошибки:

selenium.common.exceptions.WebDriverException: Message: unknown error: 
Element <a href="javascript: void(0);" id="CO" name="states">...</a> is not clickable at point (518, 9). Other element would receive the click: <li>...</li>
  (Session info: chrome=74.0.3729.157)
  (Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Windows NT 6.1.7601 SP1 x86_64)

элемент HTML (это происходит с другими подобными элементами)

<li>
    <a href="javascript: void(0);" id="CO" name="states">
        <span class="icons-ft_arrow_right"></span> 
    Colorado
    </a>
</li>

В моей функции waiter я заменил presence_of_element_located на: visibility_of_element_located element_to_be_clickable

и получил ту же ошибку.

я тоже пробовал

.send_keys(selenium.webdriver.common.keys.Keys.SPACE)

вместо

.click()

безрезультатно

вот моя waiter функция

def waiter(driver, id=None, class_name=None, link_text=None, name=None, timeout=8):
    if id is not None:
        by = By.ID
        selector = id

    elif class_name is not None:
        by = By.CLASS_NAME
        selector = class_name

    elif name is not None:
        by = By.NAME
        selector = name

    else:
        by = By.LINK_TEXT
        selector = link_text
    try:
        element_present = EC.presence_of_element_located((by, selector))
        WebDriverWait(driver, timeout).until(element_present)
        return driver
    except TimeoutException:
        time.sleep(300)
        driver.delete_all_cookies()
        try:
            element_present = EC.presence_of_element_located((by, selector))
            WebDriverWait(driver, timeout).until(element_present)
            return driver
        except TimeoutException:
            print(f"Timed out waiting for {selector} to load")
            raise ValueError('Page is fucked?')

Это работает

    time.sleep(random.randint(5, 10))
    directory_link = driver.find_element_by_class_name('ld-tab')
    directory_link.click()

Это не

    waiter(driver, class_name='ld-tab')
    directory_link = driver.find_element_by_class_name('ld-tab')
    directory_link.click()

Я ожидаю, что моя функция официанта будет успешно обеспечивать кликабельность элемента без потери времени / ненадежности функций сна. Увы, такой реальности нет.

1 Ответ

0 голосов
/ 16 мая 2019

Похоже, внутри функции официанта вы сначала ищете элемент, а затем ждете.

element_present = EC.presence_of_element_located((by, selector))
WebDriverWait(driver, timeout).until(element_present)

Попробуйте поменяться местами и сначала дождаться элемента.

...