Как разобрать ФОРМУ из WebResponse в тело POST веб-запроса

Я новичок в этом, это мое девственное путешествие, под рукой стоит задача создать транзакцию в C#, которая будет перемещаться по потоку страниц веб-приложения через WebRequest/WebResponse. У меня работает механизм Запрос / Ответ, куки и все (я могу успешно выполнить транзакцию с жестко заданными значениями для URL-адресов POST и тел POST), сложность заключается в создании динамического тела POST и URL-адреса POST для WebRequest из пар значений WebRequest, По сути, как только поток запускается с первым WebRequest, который всегда имеет один и тот же статический URL и "жестко закодированное" тело, каждый следующий запрос строится из пар значений FORM предыдущего ответа, например: часть FORM, которая находится в ответе (Я заменил открывающие и закрывающие скобки HTML квадратными, не знаю, как вставить HTML прямо сюда):

    <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"/>

а затем некоторые текстовые области в форме для отправки значений, например:

<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>

и затем на Отправить есть URL:

 <a class="detailBtnOn" href="javascript:submitForm('express?displayAction=CreateAccountWizard&amp;saveAction=SaveCreateSICCode&amp;flow=forward&amp;saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&amp;flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3')">Submit</a>

И тогда следующий WebResponse должен иметь это в своем теле POST:

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

и это как URL:

express?displayAction=CreateAccountWizard&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&flowToken=CF3827F4-1DE7-54B1-D87B-D72F01C454C3 

Но я не только не могу понять, как создать этот механизм синтаксического анализа, я даже не могу получить пары значений из FORM. Я пытаюсь использовать AgilityPack, вот что должно по крайней мере распечатать ФОРМЫ "важный" контент:

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("");
    }
}

но это только распечатывает это:

INFO  EventsLogger - 
INFO  EventsLogger - expressform: 
INFO  EventsLogger - 
INFO  EventsLogger - post 

(если я избавлюсь от бита "div" - foreach (var d в page.DocumentNode.Descendants("div")), - ничего не изменится)


Будем весьма благодарны за любую помощь или предложения о том, что происходит с анализатором распечатки FORM и как создать механизм синтаксического анализа для создания запросов из ответов.

1 ответ

Проверьте это при разборе HTML-страницы с помощью HtmlAgilityPack и этого http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html и http://htmlagilitypack.codeplex.com/discussions/247206 и Как я могу получить входные данные из определенной формы с помощью HtmlAgility Pack? Lang: C#.net

РЕДАКТИРОВАТЬ - еще немного информации:

Вы проходите через foreach через формы в HTML-документе, но вы идете после DIV в следующем foreach без ссылки на текущую форму... во внутреннем цикле (ях) foreach вам нужно нечто подобное

foreach (var d in f.SelectNodes(".//div"))

а также

foreach (var i in d.SelectNodes(".//input"))
Другие вопросы по тегам