on ne sait pas, essaie et dis nous (regarde ce que vaut script pour te faire une idée si ça peut marcher ou pas)
Version imprimable
on ne sait pas, essaie et dis nous (regarde ce que vaut script pour te faire une idée si ça peut marcher ou pas)
Hello,
il y a un truc louche dans le script javascript de ton premier message : La variable available_dates n'est pas modifiée dans le script donc elle doit avoir la valeur de son initialisation donc on devrait retrouver sa valeur dans le code source javascript de la page HTML et pas besoin d'exécuter du javascript.
[EDIT] pour extraire les dates du code source html on peut essayer quelque chose comme ceci :
Ami calmant, J.PCode:
1
2
3
4
5
6
7
8 import re with open('D:/Dev/test/testjs.html') as f: htmlString = f.read() print(htmlString) dateList = re.findall(r"AvailableDates\s*=\s*\[[^\]]+", htmlString) print(dateList[0]) dateValides = re.findall(r"\"[0-9\-]+\"",dateList[0]) print(dateValides)
2 - 3 on lit un fichier HTML et on le met dans une chaîne mais à la place on peut directement récupérer le code HTML avec selenium
5 - on capture la chaîne qui commence par available_dates suivi de = et de [ (\s dans le cas où il y a des espaces) et qui ne contient pas ] (fin de la chaîne à capturer)
7 - on capture dans cette chaîne les dates qui se trouvent entre les guillemets
output:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import re html = """ <script type="text/javascript"> var dt4 = '2019-03-07'; var blocked_dates = ["20-03-2019","01-01-1970","28-03-2019","29-03-2019","20-03-2019","01-01-1970","28-03-2019","29-03-2019"]; var available_dates = ["07-03-2019","08-03-2019","11-03-2019","12-03-2019","13-03-2019","14-03-2019","15-03-2019","18-03-2019","19-03-2019","21-03-2019","22-03-2019","25-03-2019","26-03-2019","27-03-2019"]; var fullCapicity_dates = []; var offDates_dates = ["09-03-2019","10-03-2019","16-03-2019","17-03-2019","20-03-2019","23-03-2019","24-03-2019","28-03-2019","29-03-2019","30-03-2019","31-03-2019"]; var allowArray = [1]; </script> """ date_list = re.findall(r'AvailableDates\s*=\s*\[[^\]]+', html) print(date_list[0]) av_dates = re.findall(r'\"[0-9\-]+\"', date_list[0]) print(av_dates)
Citation:
[Running] python -u "C:\Users\eloua\AppData\Local\Temp\tempCodeRunnerFile.python"
Traceback (most recent call last):
File "C:\Users\eloua\AppData\Local\Temp\tempCodeRunnerFile.python", line 15, in <module>
print(date_list[0])
~~~~~~~~~^^^
IndexError: list index out of range
[Done] exited with code=1 in 0.94 seconds
Si la liste est vide peut être faut-il revoir comment a été écrit available_dates...
- W
output :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import re html = """ <script type="text/javascript"> var dt4 = '2019-03-07'; var blocked_dates = ["20-03-2019","01-01-1970","28-03-2019","29-03-2019","20-03-2019","01-01-1970","28-03-2019","29-03-2019"]; var available_dates = ["07-03-2019","08-03-2019","11-03-2019","12-03-2019","13-03-2019","14-03-2019","15-03-2019","18-03-2019","19-03-2019","21-03-2019","22-03-2019","25-03-2019","26-03-2019","27-03-2019"]; var fullCapicity_dates = []; var offDates_dates = ["09-03-2019","10-03-2019","16-03-2019","17-03-2019","20-03-2019","23-03-2019","24-03-2019","28-03-2019","29-03-2019","30-03-2019","31-03-2019"]; var allowArray = [1]; </script> """ date_list = re.findall(r'var\s*available_dates\s*=\s*\[[^\]]+', html) av_dates = re.findall(r'\"[0-9\-]+\"', date_list[0]) print(av_dates[0]
je pense que l'argument [0] ressort la première date dans la variable available_dates. maintenant la question est comment est ce que je pourrais introduite une boucle dans le cas ou la varibale available_dates est vide []; pour que le script ne s'arrete pas jusqu'à ce qu'il trouve une date et qu'il la sélectionne .merci pour vos effortsCitation:
[Running] python -u "C:\Users\eloua\AppData\Local\Temp\tempCodeRunnerFile.python"
"07-03-2019"
[Done] exited with code=0 in 0.65 seconds
Tu en as des questions !!! Jamais tu prends un tuto et tu le lis en reproduisant les exemples qui t'apprendraient à trouver tout seul???
Et si toi tu en faisais un peu de ton côté des efforts?...Code:
1
2
3
4
5
6 tant que True (boucle infinie); faire lire html récupérer availables_dates si available_dates non vide alors break fin faire traiter availables_dates
A méditer :koi: :
Code:
1
2
3
4 dateValides = re.findall(r"\"[0-9\-]+\"",dateList[0]) if len(dateValides) > 0: for datelibre in dateValides: print(datelibre.replace('"',''))
Ben... en méditant très fort :mrgreen: j'arrive à cette conclusion que déjà tu peux remplacer par if dateValides ce qui simplifie l'écriture (tout ensemble de longueur non nulle est assimilable à True et un ensemble ne peut pas avoir de longueur négative).
Mais ensuite comme il n'y a pas de "else" alors en fait le test ne sert à rien et peut carrément disparaitre. La boucle sera alors initiée mais comme la liste est vide, ne se fera pas.
for datelibre in re.findall(r"\"[0-9\-]+\"",dateList[0]): print(datelibre.replace('"','')).
ce n'était qu'une indication pas une solution :mrgreen: et sans recherche d'optimisation
dateList[0] étant un premier tri, on peut modifier le regexp pour ne pas attraper les '"': r'[0-9\-]+'... Ce qui évite d'avoir à faire le ménage après.
Côté Python, for datelibre in dateValides: est valide/fonctionne même si dateValides est vide. Le test ne sert à rien.
- W
C'est toi qui dirige ton code, pas ton code qui te dirige. Ma remarque concernait un code d'exemple dans lequel il n'y a pas d'alternative d'écrite mais en effet, rien ne t'interdit de rajouter une alternative de ton choix dans le cas où dateValides est vide. Cependant, perso je pense que si on doit rafraichir, alors on rafraichit dans tous les cas et pas seulement dans le cas où dateVaides est vide. Sait-on jamais, des rendez-vous peuvent se ibérer entre temps...
Que j'ai une vision très lointaine donc mes suggestions peuvent effectivement ne pas correspondre à ton but que tu connais mieux que moi.
Ah ben ça correspond justement à mon algo précédent
Code:
1
2
3
4
5
6
7 tant que True (boucle infinie); faire rafraichir calendrier lire calendrier récupérer availables_dates si available_dates non vide alors break fin faire traiter availables_dates et continuer le remplissage du formulaire
j'ai essayé ca mais le code ne s'arrête pas et aucun output
Code:
1
2
3
4
5
6
7 date_list = re.findall(r'var\s*available_dates\s*=\s*\[[^\]]+', html) while True: for datelibre in re.findall(r"\"[0-9\-]+\"",date_list[0]): print(datelibre[0].replace('"','')) break else : print("no available dates")
C'est un problème qui a déjà pris 4 pages de manière plus ou moins directement en t'indiquant que pour comprendre il faut apprendre...
Si tu comprenais ce que tu fais et que tu savais ce que t'attends comme résultat, tu saurais sans doute adapter ton code pour résoudre le problème.
Seulement tu donnes des morceaux de code adaptés selon les résultats que tu donnes, et dont on ne sait même pas si tu les as utilisé de la bonne manière. Parce-que l'on a pas le code que tu as testé (je parle pas du morceau de code mais le code entier), on a pas les erreurs de l'interpréteur, le code HTML qui permet de faire des tests de notre côté, etc... donc la seule solution est de comprendre Python, pour comprendre les erreurs et modifier le code python selon tes besoins.
Ce que chacun d'entre nous, plus ou moins brusquement, essayons de te faire comprendre... mais apparemment, 3 pages plus tard on en est toujours au même point, et ça pourrait encore durer longtemps... alors à quand la remise en question ? Combien de temps avant de comprendre que python ne s'apprend pas en un jour et combien de temps te faut-il pour comprendre qu'ici on ne donnera jamais un code complet sans que tu te sortes les doigts du ... ?
Prends les choses en main, tu veux un code python, soit tu payes un presta, soit tu vas sur ce type de forum tout en apprenant le langage Python.
output :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import re html = """ <script type="text/javascript"> var dt4 = '2019-03-07'; var blocked_dates = ["20-03-2019","01-01-1970","28-03-2019","29-03-2019","20-03-2019","01-01-1970","28-03-2019","29-03-2019"]; var available_dates = []; var fullCapicity_dates = []; var offDates_dates = ["09-03-2019","10-03-2019","16-03-2019","17-03-2019","20-03-2019","23-03-2019","24-03-2019","28-03-2019","29-03-2019","30-03-2019","31-03-2019"]; var allowArray = [1]; </script> """ date_list = re.findall(r'var\s*available_dates\s*=\s*\[[^\]]+', html) if date_list: for av_date in re.findall(r"\"[0-9\-]+\"",date_list[0]) : print(av_date.replace('"','')) else : print("no available dates")
Citation:
[Running] python -u "C:\Users\eloua\AppData\Local\Temp\tempCodeRunnerFile.python"
no available dates
[Done] exited with code=0 in 0.72 seconds
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import re html = """ <script type="text/javascript"> var dt4 = '2019-03-07'; var blocked_dates = ["20-03-2019","01-01-1970","28-03-2019","29-03-2019","20-03-2019","01-01-1970","28-03-2019","29-03-2019"]; var available_dates = ["07-03-2019","08-03-2019","11-03-2019","12-03-2019","13-03-2019","14-03-2019","15-03-2019","18-03-2019","19-03-2019","21-03-2019","22-03-2019","25-03-2019","26-03-2019","27-03-2019"]; var fullCapicity_dates = []; var offDates_dates = ["09-03-2019","10-03-2019","16-03-2019","17-03-2019","20-03-2019","23-03-2019","24-03-2019","28-03-2019","29-03-2019","30-03-2019","31-03-2019"]; var allowArray = [1]; </script> """ date_list = re.findall(r'var\s*available_dates\s*=\s*\[[^\]]+', html) if date_list: for av_date in re.findall(r"\"[0-9\-]+\"",date_list[0]) : print(av_date.replace('"','')) else : print("no available dates")
Je pense que là c'est bon. maintenant puisque le input du datepicker est rempli par le js code dans le html de la page. comment pourrais renvoyer la premiere date capturée dans le input box et continuer? merciCitation:
[Running] python -u "C:\Users\eloua\AppData\Local\Temp\tempCodeRunnerFile.python"
07-03-2019
08-03-2019
11-03-2019
12-03-2019
13-03-2019
14-03-2019
15-03-2019
18-03-2019
19-03-2019
21-03-2019
22-03-2019
25-03-2019
26-03-2019
27-03-2019
[Done] exited with code=0 in 0.724 seconds
Code:<input type="text" readonly="" class="form-control-input app_date validate" style="width: 260px;" id="app_date" name="app_date" placeholder="YYYY-MM-DD" onchange="this.form.submit();showLoader();" value="" autocomplete="off">
Hello,
Il faut arrêter la boucle par un break dès qu'une date est trouvée.
Exemple (à adapter) :
On pourrait aussi prendre le premier élément de la liste sans faire de boucle.Code:
1
2
3
4
5
6 dateValides = re.findall(r"\"[0-9\-]+\"",dateList[0]) if dateValides: for datelibre in dateValides: choixDate = datelibre.replace('"','') break print(choixDate)
Ami calmant, J.PCode:
1
2
3
4 dateValides = re.findall(r"\"[0-9\-]+\"",dateList[0]) if dateValides: choixDate = dateValides[0].replace('"','') print(choixDate)
Bonjour @jurassic pork merci pour ton aide, donc
Tout ça c'est bien, mais comment faire pour renvoyer la première date par exemple dans l'input du datepickerCode:
1
2
3
4
5
6 date_list = re.findall(r'var\s*available_dates\s*=\s*\[[^\]]+', html) if date_list: for av_date in re.findall(r"\"[0-9\-]+\"",date_list[0]) : print(av_date.replace('"','')) Break else : print("no available dates")
et continuer mon script pour remplir le formulaire.Code:<input type="text" readonly="" class="form-control-input app_date validate" style="width: 260px;" id="app_date" name="app_date" placeholder="YYYY-MM-DD" onchange="this.form.submit();showLoader();" value="" autocomplete="off">
A essayer ( en utilisant aussi selenium pour piloter un navigateur et pouvoir agir sur les contrôles de la page HTML) :
Code:
1
2
3
4
5
6
7
8 # date_list = re.findall(r'var\s*available_dates\s*=\s*\[[^\]]+', html) if date_list: choixDate = date_list[0].replace('"','') print(choixDate) driver.find_element(By.ID, "app_date").clear() driver.find_element(By.ID, "app_date").send_keys(choixDate) else : print("no available dates")
Je ne vois pas pourquoi tu continues…
Maintenant que tu as les dates, ton script peut directement t'envoyer un mail (voir sms), il ne te reste plus qu'à te connecter toi-même.
Cela répond déjà à la problématique que tu nous as donné au début dans ton premier sujet !
De plus, quand je lis la faq :
Vu ton niveau plus que faible en codage, tu ferais mieux d'abandonner l'inscription via robot. (en france, c'est impossible puisqu'il y a un contrôle du payeur)Citation:
Dois-je payer le rendez-vous?
Oui, les candidats éligibles pour payer les rendez-vous doivent payer pour cela.
Comment puis-je payer le rendez-vous?
Le paiement du rendez-vous peut être effectué en utilisant n'importe quelle carte de débit ou de crédit émise par une banque marocaine.
Ce n'est pas moi qui ai soulevé la problématique citée dans la faq. Oui Maintenant que j'ai les dates il faut envoyer la première date capturée dans l'input du datepicker ( je ne sais pas si sendkeys() va marcher sachant qu'il y'a le paramètre onchange). L'idée de notifier par mail ou SMS est bonne. Pourriez-vous me donner des pistes ?
Hello,
Pour que l'événement OnChange soit déclenché il faut envoyer un "ENTER" dans le champ texte. Exemple :
Ami calmant, J.PCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys ser = Service(r"D:\\Selenium\\WebDrivers\\chromedriver.exe") options = webdriver.ChromeOptions() options.add_argument("user-data-dir=D:\\Selenium\\Profil") #Path to your chrome profile w = webdriver.Chrome(service=ser, chrome_options=options) url1 = "https://www.w3.org/WAI/UA/TS/html401/cp0102/0102-ONCHANGE-INPUT.html" w.implicitly_wait(5) # seconds w.get(url1) w.find_element(By.NAME, 'orig').clear w.find_element(By.NAME, 'orig').send_keys('Ma date') w.find_element(By.NAME, 'orig').send_keys(Keys.ENTER) print("fin")