2010-11-25 36 views
1

Lors de l'exécution d'actions sur une page Web en utilisant Test :: WWW :: Selenium, mon programme Perl écrit la sortie du test TAP dans un rapport html créé et mis à jour par TAP :: Harness.perl: écrire discrètement à IO :: Handle ouvert par TAP :: Formatter :: HTML

Mon client Selenium doit se connecter à des pages Web protégées par mot de passe, ce qui est inévitable. Ainsi, le mot de passe apparaît dans la sortie TAP.

ok 1 - open, /homepage-with-loginform.html, true 
ok 2 - type, id_username, JoeSixp 
ok 3 - type, id_password, secrIt 
... 

Pour supprimer le mot de passe de la sortie HTML, je suis venu avec la fonction ci-dessous, mais il ne fonctionne pas. Est-ce que anyony peut vous aider?

J'ai créé l'objet avec formater

my $fmt = TAP::Formatter::HTML->new; 
my $harness = TAP::Harness->new({ formatter => $fmt, merge => 1 }); 
$harness->test_args([ "--browser=$browser", "--config=$h{config}" ]); 
my $agg  = $harness->runtests(@tests); 

#remove passwords from HTML report 
remove_password(\%h, $fmt); # %h is an options hash 
... 



sub remove_password { 

    # remove password from HTML report 

    my ($h, $fmt) = @_; 

    my $passwd = $h->{password} || "xxx-xxx"; 
    my $outhtml = ${ $fmt->html() }; 

    #from the TAP::Harness perldoc 
    #html() - This is a reference to the scalar containing the html generated on the last test run. 
    #Useful if you have "verbosity" set to silent, and have not provided a custom "output_fh" to write the report to.  

    note("replacing password with xxx-xxx in html file"); 

    $fmt->html(\$outhtml); # does not work 
    $outhtml =~ s/$passwd/xxxxxx/msg; # works 


    { 
     local $/ = undef; 
     my $fh = $fmt->output_fh(); #An IO::Handle filehandle for printing the HTML report to. 
     if ($fh->opened){ 
      # 
        # ??? HOW DO I unobtrusively truncate the file here? 
      # 
      print $fh $outhtml; # writes back censored HTML output 

     } 
    } 

} 

Je pense que ce n'est pas un simple « comment puis-je tronque un fichier en utilisant perl » question.

Le fichier est déjà ouvert par un code de bibliothèque, et le code devrait fonctionner sous Unix et Windows. le programme devrait continuer à fonctionner avec $ fh, je ne veux pas l'ouvrir et le fermer moi-même, car il pourrait confondre le module TAP :: Formatter :: HTML et il pourrait cesser de fonctionner correctement.

Mise à jour

#this gets the job done but it is kind of brutal 
my $outf = $h->{outfile}; 
if ($fh->opened){ 
    $fh->close(); 
    open $fh, ">", $outf or die "cannnot open '$outf' for truncating and writing:$!"; 
    print $fh $outhtml;    
    close $fh; 
} 

Répondre

1

Hmm ... Une approche possible, mais simpliste serait de remplacer la méthode de description du TAP :: Parser Résultat :: Test (je suis sûr qu'il doit être fait au moyen d'un sous-classe mais trop tôt le matin pour trouver le bon chemin).

Quelque chose le long des lignes du projet suivant:

# Original: sub description { shift->{description} } 
*TAP::Parser::Result::Test::description = sub { 
    my $description = shift->{description}; 
    $description =~ s/type, id_password, .*$/type, id_password, XXX_PASSWORD_REMOVED_XXX/; 
    return $description; 
}; 
+0

intéressant ... peut-être que je vais essayer cette expérience plus tard – knb