2010-08-05 14 views
1

Folks,Test d'un site Web à l'aide de C#

Je dois effectuer une analyse Web sophistiquée. L'objectif en termes simples: Connectez-vous à une page, entrez des valeurs dans certains champs de texte, cliquez sur Soumettre, puis extrayez des valeurs de la page récupérée.

Quelle est la meilleure approche?

  1. Un test de l'unité 3rd party lib?
  2. Crawling manuel en C#?
  3. Peut-être y at-il une bibliothèque prête pour cela spécifiquement?
  4. Une autre approche?

Ceci doit être fait dans une application web.

Votre aide est grandement appréciée.

Répondre

3

Vous ne savez pas comment cela fonctionnera dans une application Web, mais avez-vous envisagé d'essayer le HtmlUnit? Je pense que cela devrait fonctionner car c'est un navigateur web sans tête.

Steven Sanderson a un blog post about using HtmlUnit in .NET code.

+0

Semble me rapprocher de notre objectif ... Je vais regarder dans quelques minutes et poster ici les résultats. Merci! à bientôt. – charlie

+0

C'est où je suis coincé: Il est nécessaire d'inclure le IKVM.OpenJDK.Security.dll de Java pour être disponible dans> net, mais je n'ai aucune idée de la façon de le faire ... – charlie

+0

Non, vous ne le faites pas besoin de quelque chose du Java SDK. Si vous regardez dans votre répertoire de téléchargement IKVM, vous trouverez un tas de DLL, l'un d'eux est IKVM.OpenJDK.Security.dll. Vous aurez besoin d'ajouter une référence à cela dans votre projet comme vous le feriez pour n'importe quel assemblage .NET. Vous devrez également ajouter une référence à IKVM.OpenJDK.Core, IKVM.OpenJDK.Text, IKVM.OpenJDK.Util, IKVM.OpenJDK.XML.API, IKVM.OpenJDK.XML.Parse, IKVM.OpenJDK.XML. Chemin d'accès et IKVM.Runtime.dll. – Mhmmd

4

WatiN.

http://watin.sourceforge.net/

var browser = new IE(); 

browser.GoTo("http://www.mywebsite.com"); 

browser.TextField("username").TypeText("username goes here"); // alternatively, use .Value = if you don't need to simulate keystrokes. 

browser.Button(Find.ById("submitButton")).Click(); 

et dans votre affirme sur la page de retour:

Assert.AreEqual("You are logged in as Username.", ie.TextField("username").Value); // you can essentially check any HTML tag, I just used TextField for brevity. 

Edition -

Après avoir lu l'édition à faire cela à partir d'un navigateur Web, vous pourrait envisager d'utiliser WebRequest et le HTML Agility Pack pour valider ce que vous obtenez:

WebRequest:

http://msdn.microsoft.com/en-us/library/debx8sh9.aspx

HTML Agilité Paquet:

How to use HTML Agility pack

+0

Oh désolé .. J'oublié de mentionner: Je dois ceci étant fait à l'intérieur d'une application web. C'est pourquoi je ne peux pas utiliser watin. – charlie

+0

Ah, juste vu l'application web éditer .. Cela ne va pas aider avec ça .. lol –

+0

Merci Ian d'avoir essayé. J'apprécie cela. Une autre direction? – charlie

0

Si vous savez ce que la forme des valeurs de poste sont censés aller dans et en sortant, vous pouvez créer une application dans C# qui utilise HttpWebRequest et publie sur la page et analyse les résultats. Ce code est hautement spécialisé pour mon propre usage, mais vous devriez pouvoir le modifier et le faire faire ce que vous voulez. Il fait en fait partie d'une classe plus grande qui vous permet d'ajouter des éléments post/get, puis soumet une requête http pour vous.

// this is for the query string 
char[] temp = new char[1]; 
temp[0] = '?'; 

// create the query string for post/get types 
Uri uri = _type == PostType.Post ? new Uri(url) : new Uri((url + "?" + postData).TrimEnd(temp)); 

// create the request 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 

request.Accept = _accept; 
request.ContentType = _contentType; 
request.Method = _type == PostType.Post ? "POST" : "GET"; 
request.CookieContainer = _cookieContainer; 
request.Referer = _referer; 
request.AllowAutoRedirect = _allowRedirect; 
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"; 

// set the timeout to a big value like 2 minutes 
request.Timeout = 120000; 

// set our credentials 
request.Credentials = CredentialCache.DefaultCredentials; 

// if we have a proxy set its creds as well 
if(request.Proxy != null) 
{ 
    request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
} 


// append post items if we need to 
if(!String.IsNullOrEmpty(_body)) 
{ 
    using(StreamWriter sw = new StreamWriter(request.GetRequestStream(), Encoding.ASCII)) 
    { 
    sw.Write(_body); 
    } 
} 

if(_type == PostType.Post && 
    String.IsNullOrEmpty(_body)) 
{ 
    using(Stream writeStream = request.GetRequestStream()) 
    { 
     UTF8Encoding encoding = new UTF8Encoding(); 
     byte[] bytes = encoding.GetBytes(postData); 

     writeStream.Write(bytes, 0, bytes.Length); 
    } 
} 

if(_headers.Count > 0) 
{ 
    request.Headers.Add(_headers); 
}//end if 

// we want to keep this open for a bit 
using(HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    // TODO: do something with the response 
}//end using 
+0

Merci Justin. J'ai essayé de le faire, et pour une raison quelconque, je ne peux pas passer à travers la première étape. Je reviens toujours à la première URL, et le message ne fonctionne pas, même si, lorsque je le fais manuellement, tout semble fonctionner correctement. Avez-vous un exemple de code pour cela? – charlie

+0

@charlie, le code a été ajouté. Encore une fois, c'est assez spécifique à la façon dont nous faisons les choses. Mais il vous montre comment configurer la requête et si vous avez besoin de changer des valeurs, vous pouvez certainement le faire. Plusieurs fois, la propriété allow redirect doit être définie sur false sur les publications pour empêcher les redirections automatiques qui se transforment en actions et vous perdez la publication. Je me retrouve souvent à faire un post qui est envoyé à une autre page, donc vous devez faire un post, obtenir l'URL de redirection et poster à nouveau sur cette page. Les soumissions HTTP peuvent être un peu compliquées et peuvent prendre du travail pour bien faire. – Justin

1

J'allais dire Sélénium, mais si vous allez le faire interne, je ferais probablement quelque chose comme NUnit pour écrire les essais, puis les exécuter à partir du web-app.

http://www.nunit.org/

Pourquoi dans le web-app bien? C'est comme tester une voiture dans la voiture.

+0

+1 J'aime l'analogie. –

+0

Bonne question. La réponse est comme ceci: Je travaille pour une agence de bus. Nous travaillons avec de nombreux fournisseurs de bus. Lorsque nous recevons un appel de service, les agents doivent vérifier avec de nombreux fournisseurs quel est le prix le moins cher. Donc, pour tous les fournisseurs qui nous fournissent des API, la solution est simple. Cependant, pour ceux qui fournissent des sites Web qui nécessitent une connexion pour obtenir des prix, nous devons écrire une application comme celle-ci. Maintenant: puisque notre système interne est écrit comme une application web, cette exploration est supposée faire partie de cette application web ... Bizarre à première vue, mais très utile quand on le repense ... – charlie

+1

Vous ne testez pas vraiment l'application web? Peut-être que changer votre question pour refléter le fait que vous cherchez à gratter les données d'un site Web externe pour une utilisation dans votre application Web serait approprié? – Doon

1

Si vous recherchez quelque chose de plus léger, essayez SimpleBrowser for .Net - open source chez Github.

https://github.com/axefrog/SimpleBrowser

+0

semble promettant spécialement la fonctionnalité pour utiliser jQuery comme des sélecteurs – geekonweb