Je veux cliquer sur l'icône "nouvelle commande" dans le terminal web mt4 en utilisant le module sélénium en python
Voici le code:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[3]/div[1]/a[1]/span[1]"} (Session info: chrome=86.0.4240.198)
Et voici l'erreur que j'obtiens:
from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome('./chromedriver') driver.get("https://www.mql5.com/en/trading") new_order = driver.find_element_by_xpath('/html/body/div[3]/div[1]/a[1]/span[1]') new_order.click()
Quelle est la bonne façon de localiser ce bouton? J'ai cherché et trouvé des moyens de localiser des éléments pour le sélénium, mais je n'ai pas réussi à faire fonctionner l'un d'entre eux.
3 Réponses :
Vous pouvez utiliser un autre xpath:
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 from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome('./chromedriver') driver.get("https://www.mql5.com/en/trading") time.sleep(5) iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//iframe[@id="webTerminalHost"]'))) driver.switch_to.frame(iframe) new_order = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//a[@title="New Order"]'))) new_order.click()
Mais je suggérerais By, WebDriverWait et expected_conditions:
new_order = driver.find_element_by_xpath('//a[@title="New Order"]')
Merci beaucoup.J'ai entré le code que vous avez suggéré et j'ai obtenu cette erreur: ... TimeoutException ... Ensuite, j'ai changé la valeur 10 en 40 (je ne suis pas sûr de ce que c'est) et j'ai eu la même erreur. J'ai écrit un autre code: from selenium import webdriver driver = webdriver.Chrome ('./ chromedriver') driver.get (" mql5.com/en/trading" ) result = False tandis que result == False: essayez: new_order = driver. find_element_by_xpath ('// a [@ title = "New Order"]') new_order.click () result = True sauf Exception car e: print (e) print ("done") et j'obtiens ceci: .... non tel élément ...
le 10 correspond aux secondes pendant lesquelles la page attendra. Augmentez cela pour attendre plus longtemps (comme vous l'avez fait)
@Erfan Monemi il y a une iframe mais il y a aussi un popup qui provoquera ElementClickInterceptedException
qui disparaîtra après quelques secondes. Voir la réponse mise à jour.
Merci beaucoup pour la mise à jour, j'ai copié le code mis à jour et je n'ai eu aucune erreur, mais la nouvelle fenêtre de commande ne s'est pas ouverte. J'ai ajouté "time.sleep (5)" avant la dernière ligne, puis cela a fonctionné. Merci beaucoup
Il semble que votre page traite des iframes. Ainsi, bien que la réponse ci - dessus comporte de bonnes pratiques, vous devez également passer à l'iframe:
driver.switch_to.iframe(self,frame reference)
Recherchez plus de détails sur https://www.techbeamers.com/switch-between-iframes-selenium-python/ ou https://stackoverflow.com/a/24286392/1387701
L'élément avec une info - bulle en tant que nouvel ordre se trouve dans un <iframe>
, vous devez donc:
Indiquez WebDriverAttendez que le cadre souhaité soit disponible et basculez dessus .
Indiquez WebDriverWait pour que l' élément souhaité soit cliquable .
Vous pouvez utiliser les stratégies de localisation basées sur xpath suivantes:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
Remarque : vous devez ajouter les importations suivantes:
driver.get('https://www.mql5.com/en/trading') WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='webTerminalHost']"))) WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[text()='Connect to an Account']//following-sibling::div[1]/span"))).click() WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@title='New Order']/span"))).click()
J'ai copié le code et je n'ai eu aucune erreur, mais la nouvelle fenêtre de commande ne s'est pas ouverte. J'ai ajouté "time.sleep (10)" avant la dernière ligne, puis cela a fonctionné. Et merci aussi pour le lien "Stratégies de localisation".
Pourriez-vous s'il vous plaît m'expliquer la troisième ligne? ... Se connecter à un compte ...
@ErfanMonemi //div[text()='Connect to an Account']//following-sibling::div[1]/span
following //div[text()='Connect to an Account']//following-sibling::div[1]/span
ici nous recherchons un nœud <div>
avec le texte Connect to an Account , puis passer à ses frères et sœurs suivants et identifier le premier <div>
et dans ce <div>
aller un peu plus loin vers son enfant <span>.
Désolé, je pose à nouveau une autre question, mais comment puis-je choisir une option dans la nouvelle fenêtre de commande du menu déroulant des symboles? J'ai écrit ce code: def fast_multiselect (driver, element_id, labels): select = Select (driver.find_element_by_id (element_id)) pour l'étiquette dans les étiquettes: select.select_by_visible_text (label) fast_multiselect (driver, 'symbol', "USDCAD") et obtenu cette erreur: Message: Select ne fonctionne que sur les éléments <select>, pas sur <th>
@ErfanMonemi Pouvez-vous soulever une nouvelle question selon votre nouvelle exigence s'il vous plaît? Serait heureux de vous aider.