2017-10-17 11 views
0

J'essaie de lancer automatiquement le convertisseur de devises en https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html en utilisant Selenium en Python. Voici ce que je suis arrivé à ce jour:Comment attendre le champ de saisie non vide dans Selenium Python

from selenium import webdriver                                   
from selenium.webdriver.common.by import By                                
from selenium.webdriver.support.ui import Select                              
from selenium.webdriver.support.ui import WebDriverWait                            
from selenium.webdriver.support import expected_conditions as EC 

link1 = 'https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html' 

driver1 = webdriver.PhantomJS() 
driver1.get(link1) 

script = """ var select = arguments[0]; 
      for(var i = 0; i < select.options.length; i++) { 
       if(select.options[i].value == arguments[1]) { 
       select.options[i].selected = true; 
       } 
      } 
     """ 

driver1.find_element_by_id('getDate').send_keys('05-Sep-2017')                           

select = driver1.find_element_by_id('firstID')                               
driver1.execute_script(script, select, 'USD');                                                                        

driver1.find_element_by_name('txtTAmt').send_keys('1.00')                            
driver1.find_element_by_name('txtBankFee').send_keys('0.00')                                                                     

select = driver1.find_element_by_id('newID')                               
driver1.execute_script(script, select, 'EUR');                                                                        

driver1.find_element_by_id('btnSubmit').click()                                                                        

wait = WebDriverWait(driver1, 100)                                  
element = wait.until(EC.presence_of_element_located((By.XPATH,                                 
        '//*[@name="txtCardAmt" and text() != ""]')))                       
print(element.text) 

Le problème est que le champ « txtCardAmt » ne se peuplé et j'obtenir une exception de délai d'attente. Ma question est, comment puis-je attendre que le serveur termine le calcul? PS: Je sais qu'il existe des moyens plus simples de sélectionner des options en utilisant la classe Select, mais dans ce site Web, elles ne fonctionnent pas pour une raison quelconque.

+0

Vous devez utiliser le 'wait.until_not' CE pour text_to_be_present_in_element wait.until_not (ExpectedConditions.text_to_be_present_in_element ((By.Name, "txtCardAmt"), "le texte existant)) ... Cela devrait attendre que le texte existant disparaisse. La liste déroulante est créée avec une combinaison de span, ul et li. Vous devrez cliquer manuellement et sélectionner l'option – Grasshopper

Répondre

0

Votre problème est que vous attendez jusqu'à ce que le texte de l'élément avec le nom txtCardAmt est pas vide. Le problème est que c'est toujours vrai.

Si vous jetez un oeil à l'html intéressé:

<input type="text" name="txtCardAmt" ng-model="mcz.txtCardAmt" 
class="mczreadonly ng-pristine ng-valid mczblue" placeholder="0" 
readonly="readonly" disabled=""> 

vous pouvez voir que le texte il n'y a pas.

Les informations que vous vous êtes à la recherche de (non visible dans le html) est dans l'attribut valeur:

enter image description here

C'est 7,38 dans mon exemple.

Alors:

elem = driver1.find_element_by_name('txtCardAmt') 
value = elem.get_attribute("value") 
print(value) 

Votre code concernant la sélection de la date et les monnaies ne fonctionne pas. Dans mon exemple, j'ai utilisé le xpath pour le faire. Je suis sûr qu'il y a une meilleure façon de faire ces tâches. J'ai utilisé le xpath renvoyé par les outils de l'inspecteur de mon navigateur.

L'exemple entier:

import time 
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 

link1 = 'https://www.mastercard.us/en-us/consumers/get-support/convert-currency.html' 
driver1 = webdriver.PhantomJS(executable_path=r'/pathTo/phantomjs') 
driver1.get(link1) 

driver1.find_element_by_id('getDate').click() 
wait = WebDriverWait(driver1, 20) 
wait.until(EC.presence_of_element_located((By.XPATH,"/html/body/div[1]/div/div/div/div[2]/div[3]/div/div/div[2]/div/div/div/a[1]/span"))) 
driver1.find_element_by_xpath("/html/body/div[1]/div/div/div/div[2]/div[3]/div/div/div[2]/div/div/div/a[1]/span").click() 
driver1.find_element_by_xpath("//*[@id='transactiondatepicker']/div/table/tbody/tr[2]/td[3]/a").click() 


#select = driver1.find_element_by_id('firstID') 
#driver1.execute_script(script, select, 'USD'); 
driver1.find_element_by_xpath("//*[@id='mczRowC']/div[2]/button").click() 

wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='mczRowC']/div[2]/div/ul/li[146]/a"))) 
driver1.find_element_by_xpath("//*[@id='mczRowC']/div[2]/div/ul/li[146]/a").click() 


driver1.find_element_by_name('txtTAmt').send_keys('1.00') 
driver1.find_element_by_name('txtBankFee').send_keys('2.00') 

#select = driver1.find_element_by_id('newID') 
#driver1.execute_script(script, select, 'EUR'); 
driver1.find_element_by_xpath("//*[@id='mczRowD']/div[2]/button").click() 
wait.until(EC.presence_of_element_located((By.XPATH,"//*[@id='mczRowD']/div[2]/div/ul/li[49]/a"))) 
driver1.find_element_by_xpath("//*[@id='mczRowD']/div[2]/div/ul/li[49]/a").click() 


driver1.find_element_by_id('btnSubmit').click() 

time.sleep(3) 
elem = driver1.find_element_by_name('txtCardAmt') 
value = elem.get_attribute("value") 
print(value)