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
4 Réponses :
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)
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 !!
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)
correct! vous devriez passer à l'iframe! J'ai ajouté l'approche d'attente à ma réponse ... bonne prise!
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')
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:
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:
Vous trouverez ici une discussion pertinente sur Façons de traiter #document sous iframe
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.
Ce serait formidable si vous pouviez également partager l'extrait de code HTML. afin que nous puissions regarder le Xpath