2
votes

Python Selenium, aidez-moi à localiser un élément dans un site Web

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.


0 commentaires

3 Réponses :


1
votes

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


4 commentaires

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



4
votes

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


0 commentaires

1
votes

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


5 commentaires

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.