如何将文本发送到 https://mail.protonmail.com 注册页面中的用户名字段?

How to send text to the Username field within https://mail.protonmail.com registration page?

我在 运行 时制作了 proton 邮件脚本,它工作正常,但没有输入用户名。此脚本未键入任何文本。请帮助我!!

我在倒数第二行有错误

这是我的错误:

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

我遇到了 selenium 网络驱动程序的问题

    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,所以在clicksendKeys之前的第一步,我们需要switchiframe

<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,然后才能访问您添加的 element.However time.sleep(),这实际上会减慢您的自动化 progress.You 应该使用 Explicit Wait

试试下面的代码。

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")
      
  • 浏览器快照:

Here you can find a relevant discussion on