Решено Selenium: Консоль js код работает, но не python -> TypeError: document.getElementById (...) пустая ошибка при нажатии на элемент в iframe - PullRequest
0 голосов
/ 09 января 2020

Мой код Selenium заходит на веб-сайт, затем достигает страницы с кнопкой, которая существует в iframe. Осмотрев элемент в chrome и используя консоль браузера, я нашел iframe:

iframe = document.getElementById("deputy-app-view1045")

Затем я нашел элемент и смог щелкнуть по нему:

iframe.contentWindow.document.getElementById("csv_download").click()

В моем коде python я вставил:

browser.execute_script('document.getElementById("deputy-app-view1043").contentWindow.document.getElementById("csv_download").click()')

Однако ошибка "TypeError: document.getElementById(...) is null".: (

[РЕШЕНИЕ] ВЫИГРАЛ ЭТО! Просто пришлось добавить «возврат») внутри скрипта js! Спасибо всем! СТАРНАЯ ВЕРСИЯ:

browser.execute_script('document.getElementsByClassName("app-iframe dg-content-box margin-none Report Builder (BETA) ready")[0].contentWindow.document.getElementById("csv_download").href') 

ФИКСИРОВАННАЯ ВЕРСИЯ:

browser.execute_script('return document.getElementsByClassName("app-iframe dg-content-box margin-none Report Builder (BETA) ready")[0].contentWindow.document.getElementById("csv_download").href')

1 Ответ

0 голосов
/ 09 января 2020

Поскольку требуемый элемент находится в пределах <iframe>, поэтому для вызова click() на элементе необходимо:

  • Ввести WebDriverWait для требуемого рамка должна быть доступна и переключиться на нее .
  • Индуцировать WebDriverWait для желаемого элемента, который будет активным для клика .
  • Вы можно использовать любую из следующих стратегий локатора ::

    • с использованием CSS_SELECTOR:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[id^='deputy-app-view']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#csv_download"))).click()
      
    • с использованием XPATH:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[starts-with(@id, 'deputy-app-view')")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "csv_download"))).click()
      

Здесь вы можете найти соответствующую дискуссию по Способам работы с #document в iframe

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