Código

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
chrome = webdriver.Chrome(executable_path= 'C:\webdriver.exe\chromedriver.exe',port=9515)
url = 'https://protonmail.com/'
chrome.get(url)
chrome.implicitly_wait(10)
chrome.find_element_by_xpath('//*[@class="btn btn-default btn-short"]').click()
chrome.find_element_by_class_name("panel-heading").click()
chrome.find_element_by_id("freePlan").click()
chrome.find_element_by_id('username')
chrome.find_element_by_id("password").send_keys('password')
chrome.find_element_by_id("passwordc").send_keys('password')

Html

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

Problema

chrome.find_element_by_id('username')

Estoy tratando de poder ingresar un nombre de usuario; Sin embargo, Python dice que no puede encontrar el elemento a pesar de que estoy usando la identificación que le da, que es nombre de usuario

0
Sebastian Bucarion 26 feb. 2020 a las 07:21

2 respuestas

La mejor respuesta

Hola, acabo de modificar tu código y ahora funciona:

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

import time

chrome = webdriver.Chrome(executable_path= 'C:\webdriver.exe\chromedriver.exe',port=9515)

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

chrome.get(url)

chrome.implicitly_wait(10)

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

chrome.find_element_by_class_name("panel-heading").click()

chrome.find_element_by_id("freePlan").click()

time.sleep(10)

#chrome.find_element_by_xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "top", " " ))]')

chrome.switch_to.frame(chrome.find_element_by_xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "top", " " ))]'))
typeinput = chrome.find_element_by_xpath('//*[@id="username"]')
typeinput.click()
typeinput.clear()
typeinput.send_keys('password')

chrome.switch_to.default_content()

chrome.find_element_by_id("password").send_keys('password')

chrome.find_element_by_id("passwordc").send_keys('password')
0
Prakhar Jhudele 26 feb. 2020 a las 06:21

Hay otras cosas que deben tenerse cuidado mientras simula la acción en AUT. es decir, spinner y cargador. Así que también debes manejarlos.

Introduzca ExplicitWait en su código. Se ha observado que mientras hace clic en el botón Registrarse, comienza a mostrar el cargador y luego muestra los planes. Entonces, para manejar ese uso debajo del código hasta que el cargador se oculta y luego haga clic en el plan requerido.

chrome.find_element_by_xpath('//*[@class="btn btn-default btn-short"]').click()
WebDriverWait(chrome, 20).until(EC.invisibility_of_element_located((By.ID, "redir"))
chrome.find_element_by_css_selector("div[aria-controls='plan-free']").click()

Y mientras realiza, haga clic en el botón Free Plan que redirige a una nueva página y muestra la nueva página cargando allí y luego carga el formulario de registro. Use el siguiente código para eso:

WebDriverWait(chrome, 10).until( EC.invisibility_of_element_located((By.ID, "pm_slow"))

Y el nombre de usuario en el formulario de registro se carga bajo iframe, por lo que primero debe cambiar a iframe y luego llevar a cabo más acciones

username_frame = chrome.find_element_by_xpath("//div[@class='usernameWrap']//iframe[@title='Registration form']")
chrome.switch_to.frame(username_frame)
WebDriverWait(chrome, 10).until( EC.visibility_of_element_located((By.ID, "username"))
chrome.find_element_by_id('username').send_keys(‘username’)
chrome.switch_to.default_content()
chrome.find_element_by_id("password").send_keys('password')
chrome.find_element_by_id("passwordc").send_keys('password')
0
NarendraR 26 feb. 2020 a las 06:55