Я сделал скрипт протонной почты, когда запускаю его, он работает правильно, но не набирает имя пользователя. Этот скрипт не печатал никакого текста. Пожалуйста помогите!!
У меня была ошибка в предпоследней строке
вот моя ошибка:
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






Вы должны использовать 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, поэтому переключение должно быть выполнено до щелчка или любого другого метода. Он уже добавил сон, так что, возможно, это не проблема синхронизации.
Пожалуйста, помогите мне о пароле Этот скрипт теперь набирает имя пользователя, но не набирает пароль Пожалуйста, помогите мне!!
Ваш элемент находится в 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! Я добавил подход ожидания к моему ответу ... хороший улов!
Существует 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>, вам необходимо:
Вы можете использовать следующее решение:
Блок кода:
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")
Снимок браузера:
Here you can find a relevant discussion on Ways to deal with #document under iframe
Братан, пожалуйста, помогите мне с паролем, он не набирает пароль, пожалуйста, помогите мне!
@HamzaMirchi Не могли бы вы задать новый вопрос для вашего нового требования, пожалуйста? Участники StackOverflow будут рады вам помочь.
Было бы здорово, если бы вы также могли поделиться фрагментом HTML. так что мы можем посмотреть на Xpath