Selenium e il controllo sul tipo di file

Come caso d’uso mi era stato chiesto di verificare che il tipo di file  generato da una pagina web fosse PDF (qualora si cliccasse sull’icona in alto a destra) , vedi: http://ec.europa.eu/ewsi/en/info_sheet.cfm?ID_CSHEET=53

Come forse già sapete non potete sapere via javascript il tipo di file (potete controllare l’estensione ma non è certamente la stessa cosa) però è possibile in PHP tramite le funzioni FileInfo (vedi: http://www.php.net/manual/en/ref.fileinfo.php).

Volevo quindi creare un comando di Selenium che dato l’url di un file mi verifica se questo è del tipo che mi interessa (nel mio caso PDF, ma l’ho generalizzato).

Guardiamo prima il test selenium:

test_pdf
open /ewsi/en/index.cfm
clickAndWait link=Country info >
clickAndWait link=Italy
storeAttribute //div[@id=’fontpriv’]/a[1]@href linkfile
checkFileType linkfile PDF

Dunque nella variabile linkfile è contenuto il link (relativo alla base url nel mio caso http://ec.europa.eu) al file generato, chiamo poi il mio comando checkFileType che controlla che a quel link (trasformandolo in indirizzo assoluto) ci sia un file di tipo PDF.

Andiamo a vedere il file javascript da usare come user extension:

Selenium.prototype.doCheckFileType = function(uri,filetype){

    var baseurl = "http://ec.europa.eu";

    var params = [
	 {
	 "param" : "url",
	 "value" : baseurl+storedVars[uri],
	 }
	 ];

     var lista = "";
	 for(var i=0; i<params.length; i++){
	 	lista +="&" + params[i].param + "=" + encodeURIComponent(params[i].value);
	 }

	proxytype = "http://localhost/tipo.php?";
	var indirizzo = proxytype+lista;
	LOG.info( 'indirizzo = ' + indirizzo);

	var responseXML = chiamaWebService(indirizzo);
	LOG.info( 'response = ' + responseXML);
	var valore = responseXML.getElementsByTagName('filetype')[0].firstChild.nodeValue;

    valore = valore.substring(0,3);

    Assert.matches(filetype, valore);
};

Vi manca la funzione chiamaWebService che potete trovare nell’articolo precedente.

Potete vedere che ho lasciato il tutto molto generico (ciclo for che non serve a molto):

  1. ho semplicemente aggiunto la base url ed estratto l’url dalla variabile uri memorizzata nell’array storedVars
  2. chiamo il web service all’indirizzo http://localhost/tipo.php (che andiamo a vedere dopo)
  3. salvo nella variabile valore la risposta XML (ed estraggo i primi 3 caratteri che contengono il tipo del file). Il contenuto della risposta si trova dentro il tag <filetype>.
  4. verifico che il contenuto della variabile valore corrisponda al tipo che ho richiesto con la Assert.matches (se corrisponde il comando passa altrimenti genera un errore del tipo: [error] Actual value ‘GIF’ did not match ‘PDF’).

Ovviamente se la variabile linkfile contiene un indirizzo assoluto potete lasciare vuota la variabile baseurl o rimuoverla.

Andiamo a vedere il codice del file tipo.php:

<?php
    $content = file_get_contents($_GET['url']);
    $finfo = new finfo;
    $fileinfo = $finfo->buffer($content);
    header('Content-type: text/xml');
    echo "<filetype>".$fileinfo."</filetype>";
?>

Come potete vedere il file php è molto semplice, prima otteniamo il contenuto del file con file_get_content dalla url passata per parametro (nota che la url passata da javascript è codificata, in questa maniera potete passare url con parametri) e poi con finfo->buffer otteniamo il tipo di file che scriviamo dentro il file xml che restituiamo.

Buon weekend !

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s