#python #selenium #selenium-webdriver
Вопрос:
Я хочу создать электронную почту на protonmail.com с селеном, но я не могу выйти за рамки страницы регистрации, я не могу найти поле имени пользователя и отправить на него текст. Почему??в чем проблема ?? И каково же решение?
мой код
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
import time
from selenium import webdriver
from random import randint
#setuser=set()
#def randomuser():
# name='ahmad'
# num=randint(10000,999999)
# return f'{name}{num}{name[:randint(0,5)]}'
d=webdriver.Chrome()
d.get('https://protonmail.com/signup')
WebDriverWait(d, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="signup-plans"]/div[5]/div[1]/div[1]/div/div[3]/i[1]'))).click()
WebDriverWait(d, 4).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="freePlan"]'))).click()
WebDriverWait(d, 10).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="password"]'))).send_keys('12345678')
WebDriverWait(d, 4).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="repeat-password"]'))).send_keys('12345678')
try:
time.sleep(3)
d.find_element_by_css_selector('#username').send_keys('username')
d.find_element_by_css_selector('#username').submit()
except:
WebDriverWait(d, 10).until(EC.frame_to_be_available_and_switch_to_it(d.find_element_by_xpath('//iframe')))
user=d.find_element_by_xpath('//body[@class="color-norm bg-norm sign-layout-container"]//*[@id="username"]')
user.send_keys('username')
user.send_keys(Keys.ENTER)
time.sleep(3)
user.send_keys(Keys.ENTER)
Ответ №1:
Поле имени пользователя находится внутри iframe.
Чтобы получить к нему доступ, вам сначала нужно переключиться на этот iframe.
кроме того, username
это не уникальное значение идентификатора.
Кроме того, вам не нужно wait
каждый раз определять объект.
Следующее должно исправить ваш код:
wait = WebDriverWait(driver, 20)
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="signup-plans"]/div[5]/div[1]/div[1]/div/div[3]/i[1]'))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="freePlan"]'))).click()
wait.until(EC.element_to_be_clickable((By.XPATH,'//*[@id="password"]'))).send_keys('12345678')
wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@id="repeat-password"]'))).send_keys('12345678')
d.switch_to.frame(driver.find_element_by_tag_name("iframe"))
d.find_element_by_xpath("//body[contains(@class,'color-norm')]//input[@id='username']").send_keys('username')
d.find_element_by_xpath("//body[contains(@class,'color-norm')]//input[@id='username']").submit()
UPD
Пожалуйста, имейте в виду, что после переключения на iframe, чтобы получить доступ к элементам из этого iframe, вам придется вернуться к норналь-контенту с
driver.switch_to.default_content()
Комментарии:
1. Я просто не уверен, что следует использовать здесь для отправки формы
.submit()
или.send_keys(Keys.ENTER)
не отлаживал это2. Благодарен, что это работает, но когда он заполняет форму, наконец, выдает эту ошибку: Сообщение: нет такого элемента: Не удается найти элемент, И он не переходит на следующую страницу
3. Какой элемент он не может обнаружить?
4. имя пользователя.отправить()
5. Вы все еще используете форму try-except, как в вопросе?