Ich bin neu, das ist meine Jungfernfahrt, die Aufgabe besteht darin, eine Transaktion in C # zu erstellen, die durch WebRequest / WebResponse durch den Seitenfluss einer Web-App navigiert. Ich habe den Request / Response-Mechanismus funktioniert, Cookies und alle (ich kann erfolgreich eine Transaktion mit fest codierten Werten für POST-URLs und POST-Körper ausführen), die Schwierigkeit besteht darin, aus den Wertepaaren von WebRequest dynamischen POST-Body und POST-URL für die WebRequest zu generieren . Nachdem der Flow mit der ersten WebRequest gestartet wurde, die immer dieselbe statische URL und denselben "hardcoded" Body hat, wird jede folgende Anfrage aus den FORM-Wertpaaren der vorherigen Response erstellt, zum Beispiel: Teil der FORM, die in der Response enthalten ist (Ich habe HTML-öffnende und schließende Klammern durch eckige ersetzt, bin mir nicht sicher, wie man HTML direkt hier einfügen kann):
<form id="expressform" method="post" action="">
<div>
<input type="hidden" name="ScreenData.widgets.modified" value=""/><input type="hidden" name="ScreenData.header.hidden.name" value="ScreenData.widgets.modified"/><input type="hidden" name="ScreenData.marshalled" value="true"/><input type="hidden" name="ScreenData.header.hidden.name" value="ScreenData.marshalled"/><input type="hidden" name="isCreateAccountWizard" value="true"/><input type="hidden" name="ScreenData.header.hidden.name" value="isCreateAccountWizard"/>
<input type="hidden" name="versionPoint" value="77777"/>
und dann einige Textbereiche in der Form, um Werte wie folgt zu übermitteln:
<tr>
<td class="dataOut" style="padding-left:30px">
<textarea name="ScreenData.sicInfo.natureOfBusiness" rows="5" cols="60" class="dataOut" onmouseup="textAreaCounter(this,250);;" onkeypress="textAreaCounter(this,250);;" onkeyup="textAreaCounter(this,250);;" onchange="markDataDirty(this);;"></textarea>
</td>
</tr>
und dann auf Submit gibt es die URL:
<a class="detailBtnOn" href="javascript:submitForm('express?displayAction=CreateAccountWizard&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3')">Submit</a>
Und dann sollte die nächste WebResponse das in ihrem POST-Körper haben:
ScreenData.widgets.modified=&ScreenData.header.hidden.name=ScreenData.widgets.modified&ScreenData.marshalled=true&ScreenData.header.hidden.name=ScreenData.marshalled&isCreateAccountWizard=true&ScreenData.header.hidden.name=isCreateAccountWizard&versionPoint=77777&ScreenData.commonHeaderInfo.accountName=SomeAccountName&ScreenData.commonHeaderInfo.effectiveDate=08%2F01%2F2011&ScreenData.sicInfo.natureOfBusiness=business&ScreenData.sicInfo.sic=7777&ScreenData.widgets.modified=ScreenData.sicInfo.natureOfBusiness&ScreenData.widgets.modified=ScreenData.sicInfo.sic
und das als URL:
express?displayAction=CreateAccountWizard&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3
Aber nicht nur ich kann nicht herausfinden, wie man diese Parsing-Engine erstellt, ich kann nicht einmal Wertpaare von der FORM greifen. Ich versuche, AgilityPack zu verwenden, hier ist ein bisschen, das zumindest den wichtigen Inhalt von FORMs ausdrucken sollte:
var page = new HtmlDocument();
page.OptionReadEncoding = false;
var stream = HttpWResponse.GetResponseStream();
page.Load(stream);
foreach (var f in page.DocumentNode.Descendants("form"))
{
foreach (var d in page.DocumentNode.Descendants("div"))
{
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info((f.GetAttributeValue("name", null) ?? f.GetAttributeValue("id", "<no name>")) + ": ");
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(f.GetAttributeValue("method", "<no method>") + ' ');
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(f.GetAttributeValue("action", "<no action>"));
foreach(var i in f.Descendants("input"))//{
{
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info('\t' + (i.GetAttributeValue("name", null) ?? f.GetAttributeValue("id", "<no name>")));
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(" (");
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info(i.GetAttributeValue("type", "<no type>"));
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info("): " + i.GetAttributeValue("value", "<no value>"));
}
Loggers.EventsLogger.Info("");
Loggers.EventsLogger.Info("");
}
}
aber es druckt das nur aus:
INFO EventsLogger -
INFO EventsLogger - expressform:
INFO EventsLogger -
INFO EventsLogger - post
(Wenn ich das "div" Bit loswerde - foreach (var d in page.DocumentNode.Descendants ("div")), - ändert sich nichts)
Jede Hilfe oder Vorschläge dazu, was mit dem Ausdruck-Parser von FORM passiert und wie man eine Parsing-Engine zum Erstellen von Anfragen aus Antworten erstellt, wäre sehr zu begrüßen.
check this out Parsing HTML-Seite mit HtmlAgilityPack und das http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html und http://htmlagilitypack.codeplex.com/discussions/ 247206 und Wie bekomme ich die Eingaben von einem bestimmten Formular mit HtmlAgility Pack? Lang: C # .net
BEARBEITEN - weitere Informationen:
Du fährst über foreach über die Formulare im HTML-Dokument, aber du gehst nach den DIVs in der nächsten foreach, ohne auf die aktuelle Form zu verweisen ... in der inneren foreach-Schleife (n) brauchst du etwas Ähnliches
foreach (var d in f.SelectNodes(".//div"))
und
foreach (var i in d.SelectNodes(".//input"))