selenium.common.exceptions.ElementNotVisibleException: Сообщение: элемент не взаимодействует и явное ожидание не работает с Selenium и Python - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь получить доступ к PenFed , чтобы получить текущую сумму.Я провел немало исследований и, к сожалению, все еще в тупике.Я использую Python Selenium и пытаюсь нажать на кнопку начального входа в систему сбоку, чтобы увидеть поле имени пользователя.Это HTML-код элемента:

<a href="https://www.penfed.org/" class="pfui-button-login login-slide-button pfui-button pfui-btn-tertiary-dark-blue-outline" id="mobile-login" data-di-id="#mobile-login">Login</a>

Когда я пытаюсь запустить следующий код:

driver.find_element_by_id("mobile-login").click()

Я получаю следующую ошибку:

selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable

Даже когдаЯ пытаюсь использовать функции WebDriver Wait, такие как:

try:
    WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.ID, "mobile-login"))).click()
except ElementNotVisibleException:
    WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.ID, "mobile-login"))).click()

Независимо от того, как долго я заставляю их ждать, я получаю сообщение об истечении времени ожидания:

raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:

Все мои исследования говорят, чтовызов функции ожидания должен исправить это, но это не работает для меня.Я также читал, что поверх элемента может быть наложение изображения, которое мне придется вызывать перед нажатием кнопки, но я также не увидел ничего в коде веб-сайта.Если я тестирую это, единственный способ, которым я могу нажать на кнопку с помощью кода, - это если я сначала физически нажму на нее, так что я не знаю о чем-либо еще, что я могу использовать.Заранее благодарю за помощь!

ОБНОВЛЕНИЕ: Я обнаружил, что у меня работает следующий код:

element = driver.find_element_by_id("mobile-login")
driver.execute_script("$(arguments[0]).click();", element)

Но я не знаю, что на самом деле делает execute_script.Может кто-нибудь объяснить, что фрагмент кода работает, или другие альтернативы работают на них?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

Требуемый элемент является динамическим элементом, поэтому для поиска элемента необходимо вызвать WebDriverWait , чтобы элемент был кликабельным , и вы можете использовать следующее решение:

  • Блок кода:

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = Options()
    options.add_argument('start-maximized')
    options.add_argument('--disable-extensions')
    driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get('https://www.penfed.org/')
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.pfui-button.login-slide-button.pfui-button-login.dtm-global-nav[data-id='Open Log In Drawer']"))).click()
    
  • Снимок браузера:

penfed.org

0 голосов
/ 04 февраля 2019

Ссылка, по которой вы пытаетесь перейти, предназначена для мобильного сайта и не отображается, если вы просматриваете сайт с разрешением рабочего стола.Если вы уменьшите свой браузер до тех пор, пока он не изменит макет, вы увидите кнопку LOGIN, соответствующую этой ссылке.Вот почему вы получаете ElementNotVisibleException.

На ваш второй вопрос причина, по которой использование .execute_script() работает, заключается в том, что он запускает JS напрямую и может щелкнуть по чему угодно ... скрытому или нет.Selenium был разработан для взаимодействия со страницей, как пользователь, поэтому он не позволяет нажимать на невидимые элементы и т. Д. Если вы хотите, чтобы ваш скрипт действовал как пользователь, вам следует избегать использования .execute_script(), поскольку он позволяетделать на странице то, что пользователь не может сделать.

Если вы хотите войти в систему, как пользователь настольного компьютера, вам нужно нажать кнопку «ВХОД» с помощью селектора CSS ниже

button[data-id='Open Log In Drawer']

Это откроет боковую панель, где вы сможете ввести свое имя пользователя и т. Д. И войти в систему. К вашему сведению ... вам, вероятно, потребуется подождать, чтобы дать панели возможность открыться, прежде чем продолжить процесс входа в систему.

0 голосов
/ 03 февраля 2019

Код, который вы указали: JQuery .execute_script(p1, p2) запускает сценарий js, где p1 - сценарий (в вашем случае строка JQuery, которая щелкает элемент), а p2 - требуемый элемент.Кажется, вам не нужен p2, если arguments[0] равно «элементу», но я не совсем уверен.

Одним из возможных исправлений является использование счетчика количества нажатий на элемент.Если счетчик достигает определенного числа и страница не меняется (вы можете проверить, найдя уникальный элемент / значение на текущей странице), то вы знаете, что на него нельзя нажать.

Удачи!

...