年前一个项目,需要在某个系统实现系统自动操作。

系统页面使用form提交,页面参数较多,也参数设计一系列计算逻辑,改动一个值,其他值自动改变。

传统方法使用正则表达式匹配参数,构建post参数进行请求;但这个方法使用在这个方法显然不使用,参数太多,且包含一系列计算逻辑。

如此,使用到了开源组件HtmlAgilityPack,下面这句是官方介绍:

This is an agile HTML parser that builds a read/write DOM and supports plain XPATH or XSLT (you actually don't HAVE to understand XPATH nor XSLT to use it, don't worry...).——http://htmlagilitypack.codeplex.com

简单的翻译一下就是:HtmlAgilityPack是一个支持XPATH/XSLT解析html和读/写DOM的这么一个工具。

有了HtmlAgilityPack,我们可以简单的拿到form标签下的所有标签;一系列的计算逻辑也变得很简单,我们不用关注javasctrip计算的值是如何赋值,赋值在哪个标签。只需要使用相同的逻辑赋值在相同的标签即可。

HtmlAgilityPack用法就不做示例了,很简单,百度一下就有。基本操作有几个:

    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

    HtmlNode.ElementsFlags.Remove("form");                 // dom包含form

    HtmlNode.ElementsFlags.Remove("option");               // dom包含option

    doc.LoadHtml("tml");

    // 选取多个节点

     HtmlNode node= doc.DocumentNode.SelectNodes("xpath");

    // 选取单个节点

     HtmlNodeCollection  nodes = doc.DocumentNode.SelectSingleNode("xpath");  

    // 获取属性值

    node.GetAttributeValue("attributename", "defaultvalue"); 

    // 设置属性值

    node.SetAttributeValue"attributename", "attributevalue"); 

    // 追加页面内容

     doc.DocumentNode.SelectSingleNode("xpath").InnerHtml = httpResult.Html;

XPATH:

  

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

HttpWebRequest结合HtmlAgilityPack实现网页form提交的更多相关文章

  1. 探求网页同步提交、ajax和comet不为人知的秘密(中篇)

    深入研究某项技术,了解使用这些技术的细节,其实最终目的都是为了完成一个选择问题:当我们要使用这些技术解决某个具体的问题时候我们到底该如何去选择.如果碰到有两种技术可以让我们达到同样的目的,我们就会不自 ...

  2. 关于button和form提交的一些问题

    1.form 中type 为submit 和button的区别 submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理( ...

  3. ajax 与 form 提交的区别

    有如下几种区别: 1. Ajax在提交.请求.接收时,都是异步进行的,网页不需要刷新:Form提交则是新建一个页面,哪怕是提交给自己本身的页面,也是需要刷新的: 2. A在提交时,是在后台新建一个请求 ...

  4. 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

    之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...

  5. AngularJS系列:表单全解(表单验证,radio必选,三级联动,check绑定,form提交验证)

    一.查看$scope -->寻找Form控制变量的位置 Form控制变量 格式:form的name属性.input的name属性.$... formName.inputField.$pristi ...

  6. struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)

    我的前台页是这样的: <body>      <form action="test.action" method="post">     ...

  7. jquery.form.js实现将form提交转为ajax方式提交的使用方法

    本文实例讲述了jquery.form.js实现将form提交转为ajax方式提交的方法.分享给大家供大家参考.具体分析如下: 这个框架集合form提交.验证.上传的功能. 这个框架必须和jquery完 ...

  8. jquery.validate+jquery.form提交的三种方式

    原文:http://www.cnblogs.com/datoubaba/archive/2012/06/06/2538873.html jquery.validate+jquery.form提交的三种 ...

  9. Extjs ajax form 提交

    1.form 提交 form.form.submit({ url: "/HandlerExcelToDB/UploadFile.ashx", params: {}, success ...

随机推荐

  1. 網站SSL加密原理簡介(2张图,握手有9个步骤,解释的很清楚)

    Secure Socket Layer說明 SSL是Secure Socket Layer(安全套接層協議)的縮寫,可以在Internet上提供秘密性傳輸.最早是Netscape公司所提出,SSL的目 ...

  2. Android用户界面 UI组件--TextView及其子类(一) TextView

    1.TextView android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none /web/email/phone/map/a ...

  3. DLL导出与调用约定

    一般来说,从DLL导出函数有两种方法.一种是使用.def文件:另一种是使用__declspec(dllexport). 使用上面两种方法各有优缺点.使用.def文件就是需要额外维护,当导出函数更改名字 ...

  4. Eclipse中如何恢复已删除文件

    [转自] http://zhangjunhd.blog.51cto.com/113473/23092

  5. ImageSwitcher 右向左滑动的实现方式

    ImageSwitcher is;...is.setInAnimation(this, android.R.anim.slide_in_left);is.setOutAnimation(this, a ...

  6. 圣诞福利到!51Testing邀你一起来狂欢!有礼就是任性~(≧▽≦)/~

    “我想变成一棵树,一棵只为你存在的圣诞树,顶上最大最亮的那颗星是我的真心,下面挂满我对你的祝福. 你的关注是我的幸福,你的肯定是我的力量,而我将用更多精彩的内容,用心的分享,给你下一个一整年的 精彩! ...

  7. Git push 时每次都需要密码的疑惑

    2015.1.13更新: 在本地搭建Git服务器时,也是有每次操作需要密码的情况. 是因为每次做推送动作时,Git需要认证你是好人.所以需要密码. 可以在 /home/username/.ssh/au ...

  8. c# const与readonly 关键字的比较

    C#中,const 与readonly是两个比较有用的关键字.const 与 readonly 定义的数据成员在初始化都不能再改变. 比如定义了 public class MathUtitlity   ...

  9. UVA 10652 Board Wrapping(凸包)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=32286 [思路] 凸包 根据角度与中心点求出长方形所有点来,然后就 ...

  10. javascript获取选中的文本/html

    首先来谈一下Selection对象和Range对象. Selection是window.getSelection()方法返回的一个对象,用于表示用户选中的文本区域.Selection对象表现为一组Ra ...