File: browser_documentation.xml

package info (click to toggle)
postfixadmin 2.3.5-2%2Bdeb7u1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 6,200 kB
  • sloc: php: 25,767; xml: 14,485; perl: 964; sh: 664; python: 169; makefile: 84
file content (199 lines) | stat: -rw-r--r-- 15,236 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<?xml version="1.0" encoding="ISO-8859-1" ?>
<page title="Documentation sur le navigateur scriptable" here="Le navigateur scriptable">
    <long_title>Documentation SimpleTest : le composant de navigation web scriptable</long_title>
    <content>
        <introduction>
            <p>
                Le composant de navigation web de SimpleTest peut tre utilis non seulement  l'extrieur de la classe <code>WebTestCase</code>, mais aussi indpendamment du framework SimpleTest lui-mme.
            </p>
        </introduction>
        <section name="script" title="Le navigateur scriptable">
            <p>
                Vous pouvez utiliser le navigateur web dans des scripts PHP pour confirmer que des services marchent bien comme il faut ou pour extraire des informations  partir de ceux-ci de faon rgulire.
                Par exemple, voici un petit script pour extraire le nombre de bogues ouverts dans PHP 5  partir du <a href="http://www.php.net/">site web PHP</a>...
<php><![CDATA[
<?php
    require_once('simpletest/browser.php');
    
    $browser = &new SimpleBrowser();
    $browser->get('http://php.net/');
    $browser->clickLink('reporting bugs');
    $browser->clickLink('statistics');
    $browser->clickLink('PHP 5 bugs only');
    $page = $browser->getContent();
    preg_match('/status=Open.*?by=Any.*?(\d+)<\/a>/', $page, $matches);
    print $matches[1];
?>
]]></php>
                Bien sr Il y a des mthodes plus simple pour raliser cet exemple en PHP. Par exemple, vous pourriez juste utiliser la commande PHP <code>file()</code> sur ce qui est ici une page fixe. Cependant, en utilisant des scripts avec le navigateur web vous vous autorisez l'authentification, la gestion des cookies, le chargement automatique des fentres, les redirections, la transmission de formulaires et la capacit d'examiner les enttes. De telles mthodes sont fragiles dans un site en constante volution et vous voudrez employer une mthode plus directe pour accder aux donnes de faon permanente, mais pour des tches simples cette technique peut s'avrer une solution trs rapide.
            </p>
            <p>
                Toutes les mthode de navigation utilises dans <a local="web_tester_documentation">WebTestCase</a> sont prsente dans la classe <code>SimpleBrowser</code>, mais les assertions sont remplaces par de simples accesseurs. Voici une liste complte des mthodes de navigation de page  page...
                <table><tbody>
                    <tr><td><code>addHeader($header)</code></td><td>Ajouter une entte  chaque tlchargement</td></tr>
                    <tr><td><code>useProxy($proxy, $username, $password)</code></td><td>Utilise ce proxy  partir de maintenant</td></tr> 
                    <tr><td><code>head($url, $parameters)</code></td><td>Effectue une requte HEAD</td></tr>
                    <tr><td><code>get($url, $parameters)</code></td><td>Tlcharge une page avec un GET</td></tr>
                    <tr><td><code>post($url, $parameters)</code></td><td>Tlcharge une page avec un POST</td></tr>
                    <tr><td><code>clickLink($label)</code></td><td>Suit un lien par son tiquette</td></tr>
                    <tr><td><code>isLink($label)</code></td><td>Vrifie si un lien avec cette tiquette existe</td></tr>
                    <tr><td><code>clickLinkById($id)</code></td><td>Suit un lien par son attribut d'identification</td></tr>
                    <tr><td><code>isLinkById($id)</code></td><td>Vrifie si un lien avec cet attribut d'identification existe</td></tr>
                    <tr><td><code>getUrl()</code></td><td>La page ou la fentre URL en cours</td></tr>
                    <tr><td><code>getTitle()</code></td><td>Le titre de la page</td></tr>
                    <tr><td><code>getContent()</code></td><td>Le page ou la fentre brute</td></tr>
                    <tr><td><code>getContentAsText()</code></td><td>Sans code HTML  l'exception du text &quot;alt&quot;</td></tr>
                    <tr><td><code>retry()</code></td><td>Rpte la dernire requte</td></tr>
                    <tr><td><code>back()</code></td><td>Utilise le bouton &quot;prcdent&quot; du navigateur</td></tr>
                    <tr><td><code>forward()</code></td><td>Utilise le bouton &quot;suivant&quot; du navigateur</td></tr>
                    <tr><td><code>authenticate($username, $password)</code></td><td>Retente la page ou la fentre aprs une rponse 401</td></tr>
                    <tr><td><code>restart($date)</code></td><td>Relance le navigateur pour une nouvelle session</td></tr>
                    <tr><td><code>ageCookies($interval)</code></td><td>Change la date des cookies</td></tr>
                    <tr><td><code>setCookie($name, $value)</code></td><td>Lance un nouveau cookie</td></tr>
                    <tr><td><code>getCookieValue($host, $path, $name)</code></td><td>Lit le cookie le plus spcifique</td></tr>
                    <tr><td><code>getCurrentCookieValue($name)</code></td><td>Lit le contenue du cookie en cours</td></tr>
                </tbody></table>
                Les mthode <code>SimpleBrowser::useProxy()</code> et <code>SimpleBrowser::addHeader()</code> sont spciales. Une fois appeles, elles continuent  s'appliquer sur les tlchargements suivants.
            </p>
            <p>
                Naviguer dans les formulaires est similaire  la <a local="form_testing_documentation">navigation des formulaires via WebTestCase</a>...
                <table><tbody>
                    <tr><td><code>setField($name, $value)</code></td><td>Modifie tous les champs avec ce nom</td></tr>
                    <tr><td><code>setFieldById($id, $value)</code></td><td>Modifie tous les champs avec cet identifiant</td></tr>
                    <tr><td><code>getField($name)</code></td><td>Accesseur de la valeur d'un lment de formulaire</td></tr>
                    <tr><td><code>getFieldById($id)</code></td><td>Accesseur de la valeur de l'lment de formulaire avec cet identifiant</td></tr>
                    <tr><td><code>clickSubmit($label)</code></td><td>Transmet le formulaire avec l'tiquette de son bouton</td></tr>
                    <tr><td><code>clickSubmitByName($name)</code></td><td>Transmet le formulaire avec l'attribut de son bouton</td></tr>
                    <tr><td><code>clickSubmitById($id)</code></td><td>Transmet le formulaire avec l'identifiant de son bouton</td></tr>
                    <tr><td><code>clickImage($label, $x, $y)</code></td><td>Clique sur l'image par son texte alternatif</td></tr>
                    <tr><td><code>clickImageByName($name, $x, $y)</code></td><td>Clique sur l'image par son attribut</td></tr>
                    <tr><td><code>clickImageById($id, $x, $y)</code></td><td>Clique sur l'image par son identifiant</td></tr>
                    <tr><td><code>submitFormById($id)</code></td><td>Transmet le formulaire par son identifiant propre</td></tr>
                </tbody></table>
                Au jourd d'aujourd'hui il n'existe aucune mthode pour lister les formulaires et les champs disponibles : ce sera probablement ajout dans des versions successives de SimpleTest.
            </p>
            <p>
                A l'intrieur d'une page, les fentres individuelles peuvent tre slectionnes. Si aucune slection n'est ralise alors toutes les fentres sont fusionnes ensemble dans une unique et grande page. Le contenu de la page en cours sera une concatnation des toutes les fentres dans l'ordre spcifi par les balises &quot;frameset&quot;.
                <table><tbody>
                    <tr><td><code>getFrames()</code></td><td>Un dchargement de la structure de la fentre courante</td></tr>
                    <tr><td><code>getFrameFocus()</code></td><td>L'index ou l'tiquette de la fentre en courante</td></tr>
                    <tr><td><code>setFrameFocusByIndex($choice)</code></td><td>Slectionne la fentre numrote  partir de 1</td></tr>
                    <tr><td><code>setFrameFocus($name)</code></td><td>Slectionne une fentre par son tiquette</td></tr>
                    <tr><td><code>clearFrameFocus()</code></td><td>Traite toutes les fentres comme une seule page</td></tr>
                </tbody></table>
                Lorsqu'on est focalis sur une fentre unique, le contenu viendra de celle-ci uniquement. Cela comprend les liens  cliquer et les formulaires  transmettre.
            </p>
        </section>
        <section name="deboguer" title="O sont les erreurs ?">
            <p>
                Toute cette masse de fonctionnalits est gniale lorsqu'on arrive  bien tlcharger les pages, mais ce n'est pas toujours vident. Pour aider  dcouvrir les erreurs, le navigateur a aussi des mthodes pour aider au dbogage.
                <table><tbody>
                    <tr><td><code>setConnectionTimeout($timeout)</code></td><td>Ferme la socket avec un dlai trop long</td></tr>
                    <tr><td><code>getRequest()</code></td><td>L'entte de la requte brute de la page ou de la fentre</td></tr>
                    <tr><td><code>getHeaders()</code></td><td>L'entte de rponse de la page ou de la fentre</td></tr>
                    <tr><td><code>getTransportError()</code></td><td>N'importe quel erreur au niveau de la socket dans le dernier tlchargement</td></tr>
                    <tr><td><code>getResponseCode()</code></td><td>La rponse HTTP de la page ou de la fentre</td></tr>
                    <tr><td><code>getMimeType()</code></td><td>Le type Mime de la page our de la fentre</td></tr>
                    <tr><td><code>getAuthentication()</code></td><td>Le type d'authentification dans l'entte d'une provocation 401</td></tr>
                    <tr><td><code>getRealm()</code></td><td>Le realm d'authentification dans l'entte d'une provocation 401</td></tr>
                    <tr><td><code>setMaximumRedirects($max)</code></td><td>Nombre de redirections avant que la page ne soit charge automatiquement</td></tr>
                    <tr><td><code>setMaximumNestedFrames($max)</code></td><td>Protection contre des framesets rcursifs</td></tr>
                    <tr><td><code>ignoreFrames()</code></td><td>Neutralise le support des fentres</td></tr>
                    <tr><td><code>useFrames()</code></td><td>Autorise le support des fentres</td></tr>
                </tbody></table>
                Les mthodes <code>SimpleBrowser::setConnectionTimeout()</code>, <code>SimpleBrowser::setMaximumRedirects()</code>,<code>SimpleBrowser::setMaximumNestedFrames()</code>, <code>SimpleBrowser::ignoreFrames()</code> et <code>SimpleBrowser::useFrames()</code> continuent  s'appliquer sur toutes les requtes suivantes. Les autres mthodes tiennent compte des fentres. Cela veut dire que si une fentre individuelle ne se charge pas, il suffit de se diriger vers elle avec <code>SimpleBrowser::setFrameFocus()</code> : ensuite on utilisera <code>SimpleBrowser::getRequest()</code>, etc. pour voir ce qui se passe.
            </p>
        </section>
        <section name="unit" title="Tests unitaires complexes avec des navigateurs multiples">
            <p>
                Tout ce qui peut tre fait dans <a local="web_tester_documentation">WebTestCase</a> peut maintenant tre fait dans un <a local="unit_tester_documentation">UnitTestCase</a>. Ce qui revient  dire que nous pouvons librement mlanger des tests sur des objets de domaine avec l'interface web...
<php><![CDATA[
class TestOfRegistration extends UnitTestCase {
    function testNewUserAddedToAuthenticator() {
        $browser = &new SimpleBrowser();
        $browser->get('http://my-site.com/register.php');
        $browser->setField('email', 'me@here');
        $browser->setField('password', 'Secret');
        $browser->clickSubmit('Register');
        
        $authenticator = &new Authenticator();
        $member = &$authenticator->findByEmail('me@here');
        $this->assertEqual($member->getPassword(), 'Secret');
    }
}
]]></php>
                Bien que a puisse tre utile par convenance temporaire, je ne suis pas fan de ce genre de test. Ce test s'applique  plusieurs couches de l'application, a implique qu'il est plus que probable qu'il faudra le remanier lorsque le code changera.
            </p>
            <p>
                Un cas plus utile d'utilisation directe du navigateur est le moment o le <code>WebTestCase</code> ne peut plus suivre. Un exemple ? Quand deux navigateurs doivent tre utiliss en mme temps.
            </p>
            <p>
                Par exemple, supposons que nous voulions interdire des usages simultans d'un site avec le mme login d'identification. Ce scnario de test le vrifie...
<php><![CDATA[
class TestOfSecurity extends UnitTestCase {
    function testNoMultipleLoginsFromSameUser() {
        $first = &new SimpleBrowser();
        $first->get('http://my-site.com/login.php');
        $first->setField('name', 'Me');
        $first->setField('password', 'Secret');
        $first->clickSubmit('Enter');
        $this->assertEqual($first->getTitle(), 'Welcome');
        
        $second = &new SimpleBrowser();
        $second->get('http://my-site.com/login.php');
        $second->setField('name', 'Me');
        $second->setField('password', 'Secret');
        $second->clickSubmit('Enter');
        $this->assertEqual($second->getTitle(), 'Access Denied');
    }
}
]]></php>
                Vous pouvez aussi utiliser la classe <code>SimpleBrowser</code> quand vous souhaitez crire des scnarios de test en utilisant un autre outil que SimpleTest.
            </p>
        </section>
    </content>
    <internal>
        <link>
            Utiliser le <a href="#scripting">navigateur web dans des scripts</a>
        </link>
        <link>
            <a href="#deboguer">Dboguer</a> les erreurs sur les pages
        </link>
        <link>
            <a href="#unit">Tests complexes avec des navigateurs web multiples</a>
        </link>
    </internal>
    <external>
        <link>
            La page du projet SimpleTest sur <a href="http://sourceforge.net/projects/simpletest/">SourceForge</a>.
        </link>
        <link>
            La page de tlchargement de SimpleTest sur <a href="http://www.lastcraft.com/simple_test.php">LastCraft</a>.
        </link>
        <link>
            <a href="http://simpletest.sourceforge.net/">L'API de dveloppeur pour SimpleTest</a> donne tous les dtails sur les classes et les assertions disponibles.
        </link>
    </external>
    <meta>
        <keywords>
            dveloppement logiciel,
            programmation php pour des clients,
            php centr autour du client,
            outils de dveloppement logiciel,
            framework de test de recette,
            scripts php gratuits,
            test unitaire de systmes d'authentification,
            ressources php,
            HTMLUnit,
            JWebUnit,
            test php,
            ressource de test unitaire,
            test web,
            authentification HTTP,
            tester la connection,
            tester l'authentification,
            tests de scurit
        </keywords>
    </meta>
</page>