JavaScript работает на консоли Chrome, но не работает в коде firefox или selenium

Я пытаюсь автоматизировать вход на следующую страницу с помощью селена: https://services.cal-online.co.il/Card-Holders/SCREENS/AccountManagement/Login.aspx?ReturnUrl=%2fcard-держатели%2fScreens%2fAccountManagement%2fHomePage.aspx

Попытка найти элементы имени пользователя и пароля с использованием как идентификатора, так и селектора css и xpath не сработала.

self._web_driver.find_element_by_xpath('//*[@id="txt-login-username"]')
self._web_driver.find_element_by_id("txt-login-password")
self._web_driver.find_element_by_css_selector('#txt-login-username')

Для всех трех я получаю исключение NoSuchElement

Я попробовал следующий JS-скрипт: document.getElementById('txt-login-username') когда я запускаю этот скрипт в selenium или firefox, он возвращает Null, но когда я запускаю его в консоли Chrome, я получаю результат, который могу использовать. Есть ли способ заставить его работать из кода Python или запустить его на самой консоли Chrome, а не из python execute_script?


person ariel6653    schedule 31.10.2019    source источник
comment
Это содержится в iframe. Хром тоже не находит.   -  person VLAZ    schedule 31.10.2019
comment
Отвечает ли это на ваш вопрос? Получить элемент из iFrame   -  person VLAZ    schedule 31.10.2019
comment
@VLAZ я получаю ошибку безопасности   -  person ariel6653    schedule 31.10.2019


Ответы (2)


Чтобы автоматизировать вход в page, используя Selenium, так как желаемые элементы находятся внутри <iframe>, поэтому вам необходимо:

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

    • Блок кода:

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      options = webdriver.ChromeOptions()
      options.add_argument("start-maximized")
      driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("https://services.cal-online.co.il/Card-Holders/SCREENS/AccountManagement/Login.aspx?ReturnUrl=%2fcard-holders%2fScreens%2fAccountManagement%2fHomePage.aspx")
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='calconnectIframe']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='txt-login-username']"))).send_keys("ariel6653")
      driver.find_element_by_xpath("//input[@id='txt-login-password']").send_keys("ariel6653")
      

Снимок браузера:

cal-online

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

person DebanjanB    schedule 31.10.2019

нашел решение проблемы. проблема действительно заключалась в том, что объект находится внутри iframe. Я попытался использовать решение, предложенное в Получить элемент из iFrame

но произошла ошибка безопасности. решение состоит в том, чтобы переключить фрейм следующим образом: driver.switch_to.frame("iframe"), и теперь вы можете использовать обычный элемент поиска

person ariel6653    schedule 31.10.2019