我是新手,这是我的处女之旅,手头的任务是在c#中创建一个事务,该事务将通过WebRequest/WebResponse浏览web应用程序的页面流。我得到了请求/响应机制工作,cookie和所有(我可以成功地执行POST URL和POST主体的硬编码值的事务),困难在于从WebRequest的值对生成动态POST主体和POST URL。从本质上讲,一旦流开始与第一个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 in page.DocumentNode.Descendants("div")), -没有任何变化)
关于表单打印输出解析器以及如何构建用于构建响应请求的解析引擎的任何帮助或建议将不胜感激。
检查这个解析HTML页面与htmllagilitypack和这个http://refactoringaspnet.blogspot.com/2010/04/using-htmlagilitypack-to-get-and-post_19.html和http://htmlagilitypack.codeplex.com/discussions/247206和我将如何得到从htmllagilitypack的某个表单的输入?朗:c# . net
编辑-更多信息:
你通过foreach在HTML文档中的表单上循环,但是你在下一个foreach中跟踪div而不引用当前表单…在内部foreach循环中,您需要类似于
的内容foreach (var d in f.SelectNodes(".//div"))
和
foreach (var i in d.SelectNodes(".//input"))