Как отправить текст в поле имени пользователя на странице регистрации https://mail.protonmail.com?

Я сделал скрипт протонной почты, когда запускаю его, он работает правильно, но не набирает имя пользователя. Этот скрипт не печатал никакого текста. Пожалуйста помогите!!

У меня была ошибка в предпоследней строке

вот моя ошибка:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".input"}

У меня проблема с селеновым веб-драйвером

    from selenium import webdriver
    import time

    url = 'https://protonmail.com/'

    driver = webdriver.Chrome()

    driver.get(url)

    driver.find_element_by_xpath('//*[@class = "btn btn-default btn-short"]').click()

    time.sleep(10)

    driver.find_element_by_class_name('panel-heading').click()

    time.sleep(10)

    driver.find_element_by_id('freePlan').click()

    time.sleep(10)

    driver.find_element_by_id('username').send_keys(Hamzalachistudios)

    time.sleep(10)

Все хорошо, но текст не печатает. Название ошибки: NoSuchElementException

Было бы здорово, если бы вы также могли поделиться фрагментом HTML. так что мы можем посмотреть на Xpath

Deep Bhatt 17.07.2019 11:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
474
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы должны использовать WebDriverWait:

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

url = 'https://protonmail.com/'

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get(url)
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@class = "btn btn-default btn-short"]'))).click()
wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'panel-heading'))).click()
wait.until(EC.element_to_be_clickable((By.ID, 'freePlan'))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it("top"))

wait.until(EC.element_to_be_clickable((By.ID, 'username'))).send_keys(Hamzalachistudios)

Как ответил @Amit Jain, вам нужно переключиться на iframe, поэтому я добавил к нему ожидание...

wait.until(EC.frame_to_be_available_and_switch_to_it("top"))

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

Amit Jain 17.07.2019 12:05

Пожалуйста, помогите мне о пароле Этот скрипт теперь набирает имя пользователя, но не набирает пароль Пожалуйста, помогите мне!!

user11759165 17.07.2019 16:27

Ваш элемент находится в iframe, поэтому первый шаг перед click или sendKeys, нам нужно от switch до iframe

<input placeholder = "Choose username" required = "" 
name = "username" messages = "[object Object]" 
iframename = "top" pattern = ".{1,40}" id = "username" class = "input">

driver.switch_to.frame("top") //switching the frame by name
driver.find_element_by_id('username').send_keys(Hamzalachistudios)

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

Moshe Slavin 17.07.2019 12:24

Существует iframe который блокирует доступ к полю ввода. Сначала вам нужно переключить его на iframe, а затем получить доступ к элементу. Однако вы добавили time.sleep(), что фактически замедляет процесс автоматизации. Вы должны использовать Явное ожидание

Попробуйте следующий код.

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

url = 'https://protonmail.com/'

driver = webdriver.Chrome()
driver.get(url)
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn.btn-default.btn-short'))).click()
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.panel-heading'))).click()
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#freePlan'))).click()
WebDriverWait(driver,20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,".top")))
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.ID,'username'))).send_keys('Hamzalachistudios')

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

Чтобы отправить последовательность символов в поле Имя пользователя, поскольку нужный элемент находится внутри <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
      
      chrome_options = webdriver.ChromeOptions() 
      chrome_options.add_argument("start-maximized")
      # chrome_options.add_argument('disable-infobars')
      driver = webdriver.Chrome(options=chrome_options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
      driver.get("https://protonmail.com/")
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='btn btn-default btn-short' and @href='signup']"))).click()
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='row']//p[text()='Basic account with limited features']"))).click()
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='btn btn-primary btn-lg pull-right' and @id='freePlan']"))).click()
      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, "//div[@class='usernameWrap']//iframe[@title='Registration form']")))
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='input' and @id='username']"))).send_keys("Hamza_Mirchi")
      
  • Снимок браузера:

protonmail

Here you can find a relevant discussion on Ways to deal with #document under iframe

Братан, пожалуйста, помогите мне с паролем, он не набирает пароль, пожалуйста, помогите мне!

user11759165 17.07.2019 16:24

@HamzaMirchi Не могли бы вы задать новый вопрос для вашего нового требования, пожалуйста? Участники StackOverflow будут рады вам помочь.

undetected Selenium 17.07.2019 16:26

Другие вопросы по теме