Автоматизация создания электронной почты в ProtonMail с использованием (Python, Selenium) - PullRequest
0 голосов
/ 13 октября 2019

Я хочу создать 10 электронных писем в ProtonMail.

Я уже автоматизировал половину части, используя PyAutoGui и Selenium, но я хочу сделать это как средство проверки, потому что иногда используются имена пользователей. Теперь я хочу сделать следующее:

  • Создать случайные имена пользователей
  • Проверить имена пользователей either by Selenium or another package(suggestions if you know any)
  • Если имя пользователя действительно, будет создан блокнот длясохраните действительные имена пользователей.

Это концепция того, что я пытаюсь построить сейчас. Мне очень жаль, если я звучу мусором, но я законно начал использовать Python несколько дней назад, и это еще не было недели, так что ... Я учусь: P

Я автоматизировал ту часть, где Seleniumзаполняет форму ProtonMail для входа в систему / регистрации, но иногда я получаю сообщение об ошибке, что имя пользователя уже занято, и я хочу, чтобы скрипт проверял, выскакивает ли это сообщение об ошибке, и если это так, строка «зарезервированный код» будетбыть выполненным, чтобы решить проблему. Затем код можно продолжить. Но я хочу, чтобы скрипт не мешал «зарезервированному коду», если элемент не всплывает.

Если кто-то здесь только для того, чтобы получить готовый код, вот вам:

import selenium
import pyautogui
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

#Variables
protonmail = "https://mail.protonmail.com/create/new?language=en"

username = input("Please enter your desired username for the email:")
password = input("Enter your password:")

driver = webdriver.Firefox()
time.sleep(4)
driver.get(protonmail)
time.sleep(7)

pyautogui.click(535, 501)
time.sleep(1)
pyautogui.typewrite(username)
time.sleep(2)
driver.find_element_by_xpath(
    "/html[1]/body[1]/div[2]/div[1]/div[1]/div[1]/div[1]/form[1]/div[1]/div[2]/div[1]/div[1]/input[1]").send_keys(
    password)
time.sleep(2)
driver.find_element_by_xpath(
    "/html[1]/body[1]/div[2]/div[1]/div[1]/div[1]/div[1]/form[1]/div[1]/div[2]/div[2]/div[1]/input[1]").send_keys(
    password)
time.sleep(2)
pyautogui.click(1284, 916)
time.sleep(2)
pyautogui.click(655, 762)
time.sleep(3)

1 Ответ

0 голосов
/ 14 октября 2019

Я только что проверил страницу регистрации ProtonMail, чтобы найти сообщение об ошибке, о котором вы говорите. Исходя из описания вашей проблемы, кажется, что вы хотите действовать по-другому в вашем коде в зависимости от наличия этого сообщения об ошибке. Ваш пример кода немного сложен для прочтения, потому что все ваши клики по абсолютным координатам, а не по фактическим WebElements, поэтому я не совсем уверен, что нажимается в вашем примере. Это может быть хорошей отправной точкой для вас:

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


# Fill in all details on form
# Click Create Account - I assume you have already done these two steps

# Check for error message -- this is in an iframe

# switch to first iframe on the page which will contain the error message
iframe = driver.find_elements_by_xpath("//iframe[@title='Registration form']")[0]

# attempt to find the error message, catch the exception if it does not exist
try:
    # Handle scenario where error message exists -- username is taken
    error_message = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//p[text()='Username already used']")))

    # better to write a handler method, instead of stuffing code into the try block
    call_some_handler_method_here()

except TimeoutException:
    # Handle scenario where error message does NOT exist -- meaning, username is not taken
    call_some_other_handler_method_here()

Этот код переключится на iframe, который содержит сообщение об ошибке для уже принятого имени пользователя - это необходимо для драйвера, чтобы найти элемент. После этого введите WebDriverWait в блоке try / except, чтобы проверить, существует сообщение об ошибке или нет.

Если сообщение об ошибке присутствует, вы окажетесь внутри блока try, где вы можете вызвать метод, чтобы продолжить соответственно.

Если сообщение об ошибке НЕ присутствует, то есть имя пользователя не занято, вы окажетесь в блоке except, где вы можете вызвать другой методдействовать соответственно (например, сохранить имя пользователя в файл).

...