Как я могу войти на сайт, содержащий iframe, используя селен? - PullRequest
0 голосов
/ 05 декабря 2018

Я хотел бы войти на сайт, используя селен.

https://www.fivestars -markets.com / login /

Эта страница использует javascript для создания логинавиджет и этот виджет находится внутри iframe.

Я пробовал следующий код Python, но безуспешно.

Пробная версия кода Python:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

browser = webdriver.Chrome()
browser.get('https://www.fivestars-markets.com/login/')
browser.implicitly_wait(15)

iframe = browser.find_elements_by_tag_name('iframe')[0]
browser.switch_to_frame(iframe)
username = browser.find_element_by_id('input_0');
username.send_keys(usernameStr)

Вот ошибка, которую я получилкогда я выполнил код Python.

Журналы трассировки ошибок:

Traceback (most recent call last):
  File "highAndlow.py", line 16, in <module>
    username = browser.find_element_by_id('input_0');
  File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 360, in find_element_by_id
    return self.find_element(by=By.ID, value=id_)
  File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 978, in find_element
    'value': value})['value']
  File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"id","selector":"input_0"}

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

Поскольку ваш вопрос « как войти в систему », а не « как заставить работать форму входа в систему », позвольте мне указать другой способ сделать это.

Если вам нужна только одна (или несколько) учетных записей для входа, вы можете использовать куки.

Идея проста:

  1. Вы создаете простой скрипт Python / Selenium, который простозапустите браузер, откройте домашнюю страницу и дождитесь любого ввода (просто чтобы выполнить ручные действия, прежде чем идти дальше)
  2. Когда скрипт ожидает, вы входите вручную, используя браузер Selenium.
  3. Вы вводите что-то в свой работающий скрипт
  4. Сценарий выводит значение куки в виде pickle данных и сохраняет его где-то

Затем для входа в систему вы просто загружаете домашнюю страницу, загружаете куки,обновите, вы вошли в систему.

Я отправил запрос на загрузку и загрузку файлов cookie с помощью Selenium & Pickle: Python: используйте cookie для входа в систему с помощью Selenium

0 голосов
/ 05 декабря 2018

Кажется, ты почти был там.Я не уверен, почему вы бы использовали find_elements_by_tag_name() с индексом [0], поскольку HTML DOM содержит только один <iframe> тег.

Как лучшепрактики, так как нужные элементы находятся в пределах <iframe>, поэтому вам необходимо:

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

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

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.xcomponent-component-frame.xcomponent-visible")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#input_0"))).send_keys(usernameStr)
      
    • Использование XPATH:

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='xcomponent-component-frame xcomponent-visible']")))
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='input_0']"))).send_keys(usernameStr)
      
    • Примечание : Вы должны добавить следующие операции импорта:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      

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

0 голосов
/ 05 декабря 2018

Вы переключаетесь на неправильный iframe.Попробуйте использовать более конкретный селектор для iframe:

iframe = browser.find_element_by_class_name('xcomponent-component-frame')
browser.switch_to_frame(iframe)
username = browser.find_element_by_id('input_0');
username.send_keys(usernameStr)
...