EC.presence_of_element_located not и WebDriverWait приводит к ошибке "Другой элемент получил бы щелчок: ..." в селене для Python
Навигация по веб-страницам ( 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 ответ
Похоже, внутри функции официанта вы сначала ищете элемент, а затем ждете.
element_present = EC.presence_of_element_located((by, selector))
WebDriverWait(driver, timeout).until(element_present)
Попробуйте поменяться местами и сначала дождаться элемента.