# [Codage] Une sorte de remplisseur de formulaire



## Astronight (4 Mars 2011)

Bonjour, alors voila, je suis un débutant en programmation, ( à vrai dire, je n'y connais presque rien) et j'aurais besoin d'aide pour créer un petit script qui me simplifierais la vie.

Trêve de bavardage, je vous explique en quoi il consiste.
Donc tout simplement, au départ, j'ai un fichier texte contenant un certain nombre de mot à raison d'un mot ou une phrase  par ligne.

Je voudrais donc les insérer sur un site web, à raison de 1 mot par page, c'est à dire, j'appuie sur le script, il me copie le premier mot sur une page web ( si possible le script valide la page web et actualise) et ensuite copie le second mot, et ainsi de suite

Pour illustrer l'exemple. 
J'ai un fichier texte se présentant sous cette forme: 
Pomme
Patate cuite
Carotte
Legume

Sur la page web 1, le script doit donc copier "pomme", le coller sur la page web puis 
il "imite" deux clics de souris sur un endroit prédéfini (c'est un endroit qui ne changera jamais, donc je pense facile à programmer pour que le script "clique" dessus)
Ensuite, quand il aura rechargé la nouvelle page, il copie colle la phrase "patate cuite" sur la page web puis réimite les clics et ainsi de suite, jusqu'à ce que la liste s'épuise!

Donc, je n'ai pas vraiment idée de la difficulté à créer un script pareil.
Y aurait-il une âme généreuse qui pourrais m'aider?

Je vous remercie pour votre aide!

Ps: Si vous connaissez juste une partie que je pourrais utiliser pour le script merci de me l'indiquer! je vous en suis reconaissant!


----------



## CathyGYM (4 Mars 2011)

Astronight a dit:


> Ps: Si vous connaissez juste une partie que je pourrais utiliser pour le script merci de me l'indiquer! je vous en suis reconaissant!



Je ne connais rien à la partie site Web... mais voici la partie ouverture et lecture du fichier, puis boucle sur les lignes lues. Je t'ai mis un affichage de chaque ligne lue, çà peut être utile pour tester.


```
tell application "Finder"
	-- Initialisation des variables Mais (répertoire user) et PathFichier (alias du fichier à lire)
	set Mais to a reference to home
	set PathFichier to file "NomFichier.txt" of folder "SousRepertoire" of folder "Repertoire" of folder "Documents" of Mais as alias
	-- Ouverture et lecture du fichier de travail "NomFichier.txt"
	open for access PathFichier
	set ContenuFic to read PathFichier
	close access PathFichier
	set ListeLigne to every paragraph of ContenuFic
	repeat with Ligne in ListeLigne
		display dialog Ligne
		-- Utilisation de chaque ligne (à faire)
	end repeat
end tell
```

Bon courage pour la suite


----------



## Astronight (4 Mars 2011)

CathyGYM a dit:


> Je ne connais rien à la partie site Web... mais voici la partie ouverture et lecture du fichier, puis boucle sur les lignes lues. Je t'ai mis un affichage de chaque ligne lue, çà peut être utile pour tester.
> 
> 
> ```
> ...



Bonjour, merci pour votre réponse, mais je n'ai pas très bien compris comment utiliser votre code.
Et spécialement celle-ci

```
set Mais to a reference to home
	set PathFichier to file "NomFichier.txt" of folder "SousRepertoire" of folder "Repertoire" of folder "Documents" of Mais as alias
```

Excusez moi mais je suis novice en codage, je viens à peine de lire quelques pages sur le net..^^


----------



## CathyGYM (4 Mars 2011)

C'est de l'applescript ; pour lire le fichier il faut d'abord lui donner un chemin. "Mais" est le terme qui permet d'avoir le chemin vers le répertoire du user ; ensuite, je suppose que le fichier à lire s'appelle "NomFichier.txt" et qu'il est dans le répertoire "Documents:Repertoire:SousRepertoire:" ; c'était juste pour donner la syntaxe à utiliser...
Il te suffit donc de mettre le vrai nom du fichier et le répertoire (et éventuellement sous-répertoire) où il se trouve...


----------



## Astronight (4 Mars 2011)

Bon en parallèle, j'ai développé une partie du code pour la partie Safari! (après avoir longuement flanné sur internet)


```
tell application "System Events"
	tell process "Safari"
		-- ouvrir ma page web
		open location "http://lapagequejeveux.com"
	end tell
end tell
delay 4   -- je veux modifier ce delay en "attendre que la page se charge"
tell application "System Events"
	tell process "Safari"
		-- taper mes données
		keystroke "blabla"
		keystroke tab
		keystroke "blabla"
		keystroke tab
	end tell
end tell
tell application "System Events"
	tell process "Safari"
		-- retaper mes données
		keystroke tab
		keystroke tab
		keystroke "bla "
		delay 1
		keystroke "blabla"
		-- simulate pressing the Enter key
		key code 36
		keystroke tab
		keystroke "1"
		keystroke tab
		keystroke "01"
		keystroke tab
		keystroke "blabla"
		keystroke tab
		keystroke "v" using command down
-- pour simuler le copier coller
	end tell
end tell
```

Ensuite, j'ai deux questions à propos de cette partie, comment simuler un clic de souris sur une interface qui je pense est javascript

ensuite, comment changer le delay 4s "en attendre que le chargement finisse"


Merci, j'attends vos réponses pour cette partie et les autres  

Aussi, pour la partie Textedit, j'ai pensé à utiliser une sorte de matrice ou de chaine, mais je ne sait pas comment l'appliquer, si quelqu'un a des idées.


----------



## Astronight (5 Mars 2011)

Update: J'ai fini la partie internet.

Il faut maintenant que le fichier  s'ouvre, que la ligne 1 se copie

qu'ensuite la ligne 2 se copie
etc..
any ideas?

Merci


----------



## CathyGYM (5 Mars 2011)

Astronight a dit:


> Il faut maintenant que le fichier  s'ouvre, que la ligne 1 se copie
> 
> qu'ensuite la ligne 2 se copie
> etc..



C'est justement ce que j'avais posté, mais peut-être que tu n'as pas compris ma réponse ?
En fait la variable "Mais" (reference to home) contient un alias vers le répertoire utilisateur, ce qui t'évite d'utiliser le chemin complet du fichier. La variable "Mais" est donc équivalent à "Macintosh HD:Users:Mon_Nom:". Mais, si tu préfères taper tout le nom de ton fichier tu peux :

```
tell application "Finder"
	set PathFichier to "Macintosh HD:Users:Mon_Nom:Documents:NomFichier.txt" as alias
	-- Ouverture et lecture du fichier de travail "NomFichier.txt"
	open for access PathFichier
	set ContenuFic to read PathFichier
	-- ContenuFic contient maintenant tout le contenu du fichier...
        -- Fermeture du fichier...
	close access PathFichier
	set ListeLigne to every paragraph of ContenuFic
.......
```
A partir de là, ListeLigne est une sorte de tableau qui contient chaque ligne de ton fichier (le fichier est lu en une seule fois...), et il te suffit de faire une boucle (repeat with Ligne in ListeLigne). Pas besoin de connaître le nombre de lignes totales. Au premier passage, Ligne sera égal à la première ligne du fichier, au deuxième passage, à la deuxième et ainsi de suite...
Si tu préfère voir un indice dans ton code, tu peux accéder à la i ème ligne avec l'instruction 
 "(item i of ListeLigne)". Tu peux alors utiliser Ligne dans la partie que tu as développé par ailleurs...
Voilà, j'espère que c'est plus clair pour toi...


----------



## Astronight (5 Mars 2011)

CathyGYM a dit:


> ```
> tell application "Finder"
> set PathFichier to "Macintosh HD:Users:Mon_Nom:Documents:NomFichier.txt" as alias
> -- Ouverture et lecture du fichier de travail "NomFichier.txt"
> ...



Merci apparement ca marche très tres bien, j'ai cependant une question, et non pas des moindres  
Je n'arrive pas à insérer les différentes lignes dans le code safari, je ne voie pas comment creer la boucle avec le "listeligne"

Désolé d'être un peu chiant 


Edit: C'est bon j'ai compris comment faire, seulement, j'ai une dizaine de messages bizarres avant de tomber sur mes pommes/patates Etc!!

	display dialog "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1038\\cocoasubrtf350"
		--> {button returned:"OK"}
	display dialog "{\\fonttbl\\f0\\fnil\\fcharset0 Verdana;}"
		--> {button returned:"OK"}
	display dialog "{\\colortbl;\\red255\\green255\\blue255;}"
		--> {button returned:"OK"}
	display dialog "\\paperw11900\\paperh16840\\margl1440\\margr1440\\vieww9000\\viewh8400\\viewkind0"
		--> {button returned:"OK"}
	display dialog "\\deftab720"
		--> {button returned:"OK"}
	display dialog "\\pard\\pardeftab720\\sl260\\ql\\qnatural"
		--> {button returned:"OK"}

Si vous savez comment les supprimer
Voila merci ^^


----------



## Anonyme (5 Mars 2011)

Bonsoir,



Astronight a dit:


> seulement, j'ai une dizaine de messages bizarres avant de tomber sur mes pommes/patates Etc!!
> 
> display dialog "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1038\\cocoasubrtf350"
> --> {button returned:"OK"}



Tu as enregistré ton fichier  dans le format *RTF*, il faut qu'il soit au format texte.

Ouvre ton fichier dans *TextEdit*, sélectionne le menu "_Format_" --> "_Convertir au format texte_"
Enregistre-le avec l'encodage "*Unicode (utf-8)*"


----------



## Astronight (5 Mars 2011)

Merci Mac_jac,
Celà marche parfaitement


```
tell application "Finder"
	-- Initialisation des variables Mais (répertoire user) et PathFichier (alias du fichier à lire)
	set Mais to a reference to home
	set PathFichier to file "Fichier.txt" of folder "Desktop" of Mais as alias
	-- Ouverture et lecture du fichier de travail "NomFichier.txt"
	open for access PathFichier
	set ContenuFic to read PathFichier
	close access PathFichier
	set ListeLigne to every paragraph of ContenuFic
	repeat with Ligne in ListeLigne
		copy Ligne --(???????????)
	end repeat
end tell
```

Par contre j'ai fouillé 10 000 forums, je n'arrive pas à trouver la commande necessaire pour copier cette "ligne" 
et la mixer avec une sorte de boucle.

Mon problème est double alors..
Pouvoir insérer au début (hors de la boucle) la premiere ligne de cette sorte de tableau
Ensuite après dans une boucle insérer (et donc copier) tout le reste des liens


Merci de votre aide!


----------



## Anonyme (5 Mars 2011)

Astronight a dit:


> Merci Mac_jac,
> 
> Par contre j'ai fouillé 10 000 forums, je n'arrive pas à trouver la commande necessaire pour copier cette "ligne"
> et la mixer avec une sorte de boucle.
> ...


Je ne suis pas sûr de comprendre le problème.

Il suffit d'utiliser item
Par exemple, je veux récupérer un élément dans la liste et la mettre dans une variable: 
set var to item 1 of ListeLigne -- récupére la première ligne
set var to item 2 of ListeLigne -- récupére la deuxième ligne

Aussi, pas besoin du open for access pour lire un fichier, c'est nécessaire seulement pour écrire dans un fichier.
	
	



```
tell application "Finder" to set PathFichier to (file "Fichier.txt" of desktop) as alias
set ListeLigne to paragraphs of (read PathFichier) -- lecture du fichier de travail "NomFichier.txt"
```


----------



## Astronight (5 Mars 2011)

Merci,
Je teste tout ca et je vous tient au courant!
@CathyGYM , Mac_JAC :Votre aide m'a été vitale 

Update: Script fini merci!


Petite question bonus d'opimisation: au lieu de lancer delay, n'y aurait-il pas un moyen de lancer un code qui permet de vérifier si la page s'est chargée?

J'ai testé ce code ci-dessus, mais il ne marche pas entre Tell application et End Tell
et on ne peux le mettre plus d'une fois

```
set loadStatus to safariWebPageLoaded(10)
if loadStatus is not true then display alert "There was an error:" message loadStatus as warning

on safariWebPageLoaded(waitTime) -- waitTime is the time in seconds the script will wait to let a web page load
	set myDelay to 0.5 -- the time in seconds you wait between checks for the web page loaded status
	set loadStatus to "There was an error when checking the load status!"
	
	try
		-- calculate the endTime... the time when you will stop waiting for the page to finish loading
		set endTime to (current date) + waitTime
		
		-- repeat until either the web page is loaded or the endTime is reached
		tell application "System Events" to tell process "Safari"
			repeat
				delay myDelay
				if (name of window 1) is "Failed to open page" then
					set loadStatus to "The url for the current web page is bad!"
					exit repeat
				else if (value of static text 1 of group 1 of window 1) is "" then
					set loadStatus to true
					exit repeat
				end if
				
				if (current date) is greater than endTime then
					set loadStatus to "The web page could not load in the allotted time!"
					exit repeat
				end if
			end repeat
		end tell
	on error theError
		set loadStatus to theError
	end try
	return loadStatus
end safariWebPageLoaded
```


----------



## Anonyme (9 Mars 2011)

Bonjour,



Astronight a dit:


> Petite question bonus d'opimisation: au lieu de lancer delay, n'y aurait-il pas un moyen de lancer un code qui permet de vérifier si la page s'est chargée?



Je m'excuse, j'avais lu ton message avant que tu l'édites, donc je n'ai pas eu de notification sur ta modification

C'est une fonction, on le met une seule fois à la fin du script.
On appelle la fonction dans un bloc Tell application comme ceci, il faut ajouter my

```
set loadStatus to my safariWebPageLoaded(10)
```
ex:
	
	



```
tell application "Safari"
	open location "http://www.apple.com/fr/"
	set loadStatus to safariWebPageLoaded(10)
	if loadStatus is not true then display alert "There was an error:" message loadStatus as warning
	
	open location "http://forums.macg.co/vbulletin/"
	set loadStatus to safariWebPageLoaded(10)
	if loadStatus is not true then display alert "There was an error:" message loadStatus as warning
end tell
-- fin du script

-- la fonction safariWebPageLoaded --
on safariWebPageLoaded(waitTime) -- waitTime is the time in seconds the script will wait to let a web page load
	set myDelay to 0.5 -- the time in seconds you wait between checks for the web page loaded status
	--bla
	--bla
end safariWebPageLoaded
```


----------



## Astronight (9 Mars 2011)

Merci Mac_Jac, que pourrais-je faire sans vous...
Ca marche à merveille!

Encore une question (celle ci concerne un autre script)
J'ai besoin de lancer un clic souris dans des endroits, afin de cliquer sur des boutons sur des pages internet.. 
et de 

J'ai testé 
	
	



```
Click at {x,y}
```
Cela ne marche pas

J'ai aussi testé avec le plugin xTool.osax (que j'ai mis dans le dossier scripting additions), cela ne marche pas non plus

Si vous avez une autre solution, je suis preneur.. (ou une qui marche)


Ps: J'ai un macbook pro 2010, avec Snow leopad 10.6 (si ca peux vous aider pour la compatibilité de logiciels tiers)


----------



## Anonyme (9 Mars 2011)

Astronight a dit:


> J'ai aussi testé avec le plugin xTool.osax (que j'ai mis dans le dossier scripting additions), cela ne marche pas non plus


xTool.osax devrait fonctionner.

Quelle version de *XTool.osax* avez-vous ?
As-tu essayé avec un délai ?
Est-ce que tu déplaces le curseur avant de faire un clic ?

Essaie ce script
	
	



```
move mouse {800, 10}
delay 1
click mouse {800, 10} times 1 delay 0.5 using primary button
```
Est-ce que le curseur se déplace ?


----------



## Astronight (9 Mars 2011)

Mac_Jac a dit:


> xTool.osax devrait fonctionner.
> 
> Est-ce que le curseur se déplace ?



Quand j'ecris ce script, 
on m'envoie ce message d'erreur _{800, 10} ne comprend pas le message move mouse.

_

J'ai la version 2.0 et (au cas ou) j'ai placé le plugin dans MacintoshHD:Bibliotheque:Scriptingadditions  (là ou se trouve SIMBL.osax)


Edit: à défaut d'utiliser Xtool.osax qui ne veux marcher, je viens de trouver Keyboard maestro qui permet de simuler des clics de souris et plein d'autres choses, il propose même un code Applescript à inserer pour simuler ce clic directement depuis un script! (si ca peut aider certaines personnes)


----------



## Anonyme (9 Mars 2011)

Astronight a dit:


> Quand j'ecris ce script,
> on m'envoie ce message d'erreur _{800, 10} ne comprend pas le message move mouse._


_
J'ai fait une recherche, *xTool.osax* ne fonctionne pas sur 10.6+

Sinon, essai avec cet exécutable *ClickMouse*--> le fichier joint
fonctionne sur 10.5, je ne sais pas pour 10.6+
Place-le dans le dossier "*Scriptingadditions*".
La syntaxe est 


		Bloc de code:
	

do shell script "/Library/ScriptingAdditions/ClickMouse 10 10"

_


----------



## Astronight (9 Mars 2011)

Je vous en suis extremement reconnaissant, il marche à merveille!


----------



## Anonyme (9 Mars 2011)

Astronight a dit:


> Je vous en suis extremement reconnaissant, il marche à merveille!


Ok, parfait.

Le code ( *C++*) de cet exécutable est de Pascal, voir ce message

Je l'ai compilé sur xCode


----------



## Astronight (10 Mars 2011)

Mac_Jac a dit:


> Ok, parfait.
> 
> Le code ( *C++*) de cet exécutable est de Pascal, voir ce message
> 
> Je l'ai compilé sur xCode



Bravo! Bon travail 

Encore un probleme se dresse devant moi

```
do shell script "/Library/ScriptingAdditions/ClickMouse 10 10"
```

N'y a t-il pas moyen d'utiliser ce script avec des variables que je définiriais? 

par exemple 
	
	



```
set Var to 0
repeat
	set Var to (Var + 1)
	if (Var = 1) then 
		set x to 483 ---- Coordonnées du point ou cliquer
		set y to 460

	end if
	
	if (Fsvar = 2) then
		set x to 483 ---- Coordonnées
		set y to 460
        end if 
	
	
	do shell script "/Library/ScriptingAdditions/ClickMouse x y"
	
	if var = 2 then exit repeat
end repeat
```


----------



## Anonyme (10 Mars 2011)

Astronight a dit:


> Encore un probleme se dresse devant moi
> 
> ```
> do shell script "/Library/ScriptingAdditions/ClickMouse 10 10"
> ...


Oui, c'est la même chose que concaténer une chaîne 

```
do shell script "/Library/ScriptingAdditions/ClickMouse  " & x & space & y -- simple clic
```

Autres possibilités, double clic ou clic droit

```
do shell script "/Library/ScriptingAdditions/ClickMouse  " & x & space & y & " 2" -- double clic
do shell script "/Library/ScriptingAdditions/ClickMouse  " & x & space & y & " r" -- clic droit
```


----------



## Astronight (15 Mars 2011)

Mac_Jac a dit:


> Oui, c'est la même chose que concaténer une chaîne
> 
> ```
> do shell script "/Library/ScriptingAdditions/ClickMouse  " & x & space & y -- simple clic
> ...



Ca mache  Merci!


----------



## Astronight (20 Juin 2011)

Bonjour, je me permet de réup ce post car j'ai perdu le fichier clickmouse.
Pouvez vous s'il vous plait pascal me le remettre?

Merci!


----------



## Anonyme (21 Juin 2011)

Astronight a dit:


> Bonjour, je me permet de réup ce post car j'ai perdu le fichier clickmouse.


Le voici


----------



## Astronight (22 Juin 2011)

J'ai un autre problème la, j'espere que celui ci est le dernier 

Donc, quand j'essaye d'écrire dans un fichier texte, je n'arrive pas à supprimer ce qu'il y a avant, et ecrire un nouveau truc.

Voila mon code 

```
tell application "Finder"
	set txt to "Voila le texte que je veux ecrire"
	-- Initialisation des variables Mais (répertoire user) et PathFichier (alias du fichier à lire)
	set Mais to a reference to home
	set PathFichier to file "fichiertest.txt" of folder "Desktop" of Mais as alias
	-- Ouverture et lecture du fichier de travail "NomFichier.txt"
	open for access PathFichier with write permission
	write txt to PathFichier
	
	close access PathFichier
	
	
end tell
```

Donc comment faire pour overwriter.. Comme si je faisait abstraction des données précédentes.

Merci pour votre réponse!


----------



## Anonyme (22 Juin 2011)

Bonjour,



Astronight a dit:


> J'ai un autre problème la, j'espere que celui ci est le dernier
> 
> Donc, quand j'essaye d'écrire dans un fichier texte, je n'arrive pas à supprimer ce qu'il y a avant, et ecrire un nouveau truc.



il faut utiliser "set eof to 0"

```
set txt to "Voila le texte que je veux ecrire"
set PathFichier to (path to desktop folder as string) & "fichiertest.txt"

-- Ouverture et lecture du fichier de travail "NomFichier.txt"
set openFile to open for access file PathFichier with write permission
set eof openFile to 0 -- efface le contenu du fichier
write txt to openFile
close access openFile
```

Le tell application "*Finder*" n'est pas nécessaire pour écrire ou lire un fichier


----------



## Astronight (22 Juin 2011)

Bonjour, ok , Ca permet d'alleger mon script 
Et merci ca marche.


----------



## Astronight (23 Juin 2011)

Un dernier obstacle se dresse sur mon passage : 

Suite à l'utilisation de votre script, de temps en temps, de manière aléatoire, j'ai Text edit qui "beug".
Je m'explique : 
Si j'ouvre Textedit, j'écrit quelque chose dessus puis j'enregistre et je quitte. Le fichier ne s'enregistre pas. Le fichier enregistré est seulement un fichier contenant des espaces.
En fait, si j'écrit : 
 " Ceci est un message texte
Ceci est un message texte"

Il enregistre plutôt deux ligne vide.


Aussi, si je veux exploiter un fichier texte écrit sous Textedit ou autre, Applescript déjante et exécute mal les commandes! (Si par exemple, je veux mettre le 5eme mot de la seconde ligne dans une variable, quand ce bug se produit il relève le 4eme mot et non le 5eme).
Ceci est très gênant d'autant plus que si je quitte applescript  ou textedit, le bug ne s'estompe pas!
Celui ci s'estompera plus tard de manière aléatoire.

Edit : Je viens de relever un autre beug relatif à celui la
Si j'extraie une ligne d'un fichier texte quand ce bug se produit.
et j'execute le code "

```
tell application "System Events"
		tell process "Safari"
keystroke txt
end tell
end tell
```

Si le message stocké dans la variable txt est "Message stocké dans la variable"
Le message ecrit sera "Mqeqsqsqaqgqeq qsqtqoqcqkqéq qdqaqnqsq qlqaq qvqaqrqiqaqbqlqe"

En gros, l'ajout d'un q entre chaque lettre


----------



## Astronight (24 Juin 2011)

Astronight a dit:


> Un dernier obstacle se dresse sur mon passage :
> 
> Suite à l'utilisation de votre script, de temps en temps, de manière aléatoire, j'ai Text edit qui "beug".
> Je m'explique :
> ...



et de plus, mon fichier text, ecrit à partir du code 

```
set txt to "Voila le texte que je veux ecrire"
set PathFichier to (path to desktop folder as string) & "fichiertest.txt"

-- Ouverture et lecture du fichier de travail "NomFichier.txt"
set openFile to open for access file PathFichier with write permission
set eof openFile to 0 -- efface le contenu du fichier
write txt to openFile
close access openFile
```

Commence par recout8utxt


----------

