Почему я не могу щелкнуть этот элемент сразу после его нахождения в зависимости от того, когда в коде я пытаюсь щелкнуть по нему? - PullRequest
0 голосов
/ 19 января 2020

Просто предисловие, я только начал возиться с 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 () потерпит неудачу. Я просто хочу иметь возможность передавать эти элементы в моем коде. Спасибо

РЕДАКТИРОВАТЬ: забыл код, фактически вызывающий эту функцию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...