1
votes

Comment envoyer du texte dans le champ Nom d'utilisateur dans la page d'inscription https://mail.protonmail.com?

J'ai créé un script de messagerie proton lorsque je l'exécute, il fonctionne correctement mais il ne saisit pas le nom d'utilisateur. Ce script n'a tapé aucun texte. S'il vous plaît aidez-moi !!

J'ai eu une erreur dans l'avant-dernière ligne

voici mon erreur:

NoSuchElementException: Message: aucun élément de ce type: impossible de localiser élément: {"method": "css selector", "selector": ". input"}

J'ai un problème avec le pilote web sélénium

    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)

Tout va bien mais il ne tape aucun texte. Nom de l'erreur: NoSuchElementException


1 commentaires

Ce serait formidable si vous pouviez également partager l'extrait de code HTML. afin que nous puissions regarder le Xpath


4 Réponses :


0
votes

Vous devriez utiliser WebDriverWait:

wait.until(EC.frame_to_be_available_and_switch_to_it("top"))

Comme @Amit Jain a répondu, vous devez passer à l'iframe donc j'ai ajouté l'attente ...

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)


2 commentaires

hé, l'élément est dans iframe, alors passez à faire, avant de cliquer ou de toute autre méthode. Il a déjà ajouté le sommeil, donc ce n'est peut-être pas un problème de synchronisation.


Aidez-moi à propos du mot de passe Ce script saisit maintenant le nom d'utilisateur mais pas le mot de passe. Veuillez m'aider !!



2
votes

Votre élément est dans iframe , donc la première étape avant de cliquer ou sendKeys , nous devons basculer vers 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)

entrez la description de l'image ici


1 commentaires

correct! vous devriez passer à l'iframe! J'ai ajouté l'approche d'attente à ma réponse ... bonne prise!



0
votes

Il existe un iframe qui bloque l'accès à la zone de saisie. Vous devez d'abord le basculer sur iframe , puis pouvoir accéder à l'élément.Cependant, vous avez ajouté time.sleep () qui ralentit en fait la progression de votre automatisation. a href = "https://selenium-python.readthedocs.io/waits.html" rel = "nofollow noreferrer"> Attente explicite

Essayez le code suivant.

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')


0 commentaires

1
votes

Pour envoyer une séquence de caractères dans le champ Nom d'utilisateur car l'élément souhaité se trouve dans un , vous devez donc:

  • Indiquez WebDriverWait pour que le cadre souhaité soit disponible et passez-y .
  • Indiquez WebDriverWait pour que l'élément souhaité soit cliquable .
  • Vous pouvez utiliser la solution suivante:

    • Bloc de code:

      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")
      
  • Instantané du navigateur:

  •  protonmail

    Vous trouverez ici une discussion pertinente sur Façons de traiter #document sous iframe


    2 commentaires

    Bro Veuillez m'aider à propos du mot de passe Il ne saisit pas le mot de passe Veuillez m'aider!


    @HamzaMirchi Pouvez-vous soulever une nouvelle question pour votre nouvelle exigence s'il vous plaît? Les contributeurs de StackOverflow se feront un plaisir de vous aider.