Просто предисловие, я только начал возиться с python, и у меня нет gr asp на многих python -specifi c концепциях.
Я рефакторинг некоторого кода и я пытаюсь скрыть свою грубую обработку ошибок при получении веб-элементов Selen, и я столкнулся со странной проблемой при передаче элементов вокруг:
selenium_handler.py:
import time
from selenium.webdriver.chrome.webdriver import WebDriver
import selenium
def highlight(element):
"""Highlights (blinks) a Selenium Webdriver element"""
driver = element._parent
def apply_style(s):
driver.execute_script("arguments[0].setAttribute('style', arguments[1]);",
element, s)
original_style = element.get_attribute('style')
apply_style("background: yellow; border: 2px solid red;")
time.sleep(.3)
apply_style(original_style)
def find_element(driver: WebDriver, xpath: str, url: str = "", test: bool = True, max_timeout: int = -1,
max_attempts: int = -1, time_between_attempts: int = 0) -> selenium.webdriver.remote.webelement.WebElement:
if url:
driver.get(url)
start_time = time.time()
end_time = start_time + max_timeout
attempt_count = 0
element: selenium.webdriver.remote.webelement.WebElement
while time.time() < end_time if max_timeout >= 0 else True and \
attempt_count < max_attempts if max_attempts >= 0 else True:
attempt_count += 1
try:
element = driver.find_element_by_xpath(xpath)
if test:
print("highlighting")
highlight(element)
# element.click()
break
except:
time.sleep(time_between_attempts)
pass
# should only be past here if something went wrong so send error
element.click()
return element
raise Exception("could not get element")
main.py:
from selenium import webdriver
from real_project import selenium_handler
import time
driver = webdriver.Chrome()
# -------------------------------Cape Coral----------------------
cape_coral_url = "https://capegis.maps.arcgis.com/apps/webappviewer/index.html?id=bbce9a471a534e7482d35716c4cb6f36"
time_for_elements_to_be_found = 5
def prepare_for_batch():
driver.refresh()
ok_button = selenium_handler.find_element(driver, url=cape_coral_url,
xpath="html/body/div[2]/div[2]/div[2]/div[2]/div[2]/div[2]/button",
# test=False,
max_timeout=time_for_elements_to_be_found)
print(type(ok_button))
while True:
try:
ok_button.click()
break
except:
pass
prepare_for_batch()
time.sleep(5)
driver.close()
Моя ошибка обнаруживается в element.click (). Как так, я получу ошибку, что элемент не взаимодействует. Но если я вместо этого использую element.click () внутри блока try catch, он всегда будет работать, без проблем. Если я запускаю нижний элемент element.click () в while-try-break-кроме l oop, как, например, первый, то в конечном итоге он щелкнет.
Почему это происходит? Не похоже, что это состояние гонки, или что html все еще загружается, или что-то в этом роде, иначе первый element.click () потерпит неудачу. Я просто хочу иметь возможность передавать эти элементы в моем коде. Спасибо
РЕДАКТИРОВАТЬ: забыл код, фактически вызывающий эту функцию