如何将文本发送到 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
,所以在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
,然后才能访问您添加的 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
我在 运行 时制作了 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
,所以在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
,然后才能访问您添加的 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