Как разобрать ФОРМУ из 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&saveAction=SaveCreateSICCode&flow=forward&saveActionToken=84454A7D-50FE-5856-CE17-916B70EDFE1A&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"))