Как разобрать ФОРМУ из WebResponse в тело POST веб-запроса - PullRequest
1 голос
/ 05 августа 2011

Я новичок в этом, это мое девственное путешествие, под рукой стоит задача создать транзакцию в 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"/>

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

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

и затем при Submit есть 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 Ответ

0 голосов
/ 05 августа 2011

проверьте это Синтаксический анализ 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"))
...