注:些部分内容需要对WatiN代码结构有所了解。

  上篇讲的WatiN原生的有一部分Html元素类,WatiN从2012年9月15日后就未见更新,随着Html新标签的出现就需要我们自己定义一些Html元素类来扩充。

1、 例子分析

  以time标签为例,首先需要知道time标签在Html中起到的什么作用,在W3School中解释为:该元素能够以机器可读的方式对日期和时间进行编码。既然是表示时间,那么就我们写这个标签类的时候就需要获取和设置时间。

2、创建Html标签

  a、创建实体类,实体类继承于ElementContainer<TElement>,并新增其两个属性。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using WatiN.Core.Native;
 6
 7 namespace WatiN.Core
 8 {
 9     [ElementTag("time")]
10     public class Time : ElementContainer<Time>
11     {
12         public Time(DomContainer domContainer, INativeElement nativeElement) : base(domContainer, nativeElement) { }
13         public Time(DomContainer domContainer, ElementFinder finder) : base(domContainer, finder) { }
14
15         /// <summary>
16         /// 获取或设置datetime属性
17         /// </summary>
18         public virtual string DateTime
19         {
20             get { return GetAttributeValue("datetime"); }
21             set { SetAttributeValue("datetime", value); }
22         }
23         /// <summary>
24         /// 获取或设置pubdate属性
25         /// </summary>
26         public virtual string PubDate
27         {
28             get { return GetAttributeValue("pubdate"); }
29             set { SetAttributeValue("pubdate", value); }
30         }
31     }
32 }

  b、创建检索类

 1 namespace WatiN.Core
 2 {
 3
 4     public class TimeCollection : BaseElementCollection<Time, TimeCollection>
 5     {
 6
 7         public TimeCollection(DomContainer domContainer, ElementFinder finder) : base(domContainer, finder) { }
 8
 9         protected override TimeCollection CreateFilteredCollection(ElementFinder elementFinder)
10         {
11             return new TimeCollection(DomContainer, elementFinder);
12         }
13     }
14 }

  c、修改NativeElementCollectionAdapter.cs类,此类为元素检索适配器,在其IElementsContainer Members代码块中添加Time元素的操作

 1         public Time Time(string elementId)
 2         {
 3             return Time(Find.ByDefault(elementId));
 4         }
 5
 6         public Time Time(Regex elementId)
 7         {
 8             return Time(Find.ByDefault(elementId));
 9         }
10
11         public Time Time(Constraint findBy)
12         {
13             return new Time(domContainer, CreateElementFinder<Time>(findBy));
14         }
15
16         public Time Time(Predicate<Time> predicate)
17         {
18             return Time(Find.ByElement(predicate));
19         }
20
21         public TimeCollection Times
22         {
23             get { return new TimeCollection(domContainer, CreateElementFinder<Time>(null)); }
24         }

  d、修改Document.cs类,此类为页面容器基类,其中IE、Browser、Frame、DomContainer都继承于它,在其中添加Time元素后其页面容器类中即可直接使用。将Time元素操作放入IElementsContainer代码块中。

 1      #region 新增元素
 2         #region Time
 3         public virtual Time Time(string elementId)
 4         {
 5             return AllElements.Time(elementId);
 6         }
 7
 8         public virtual Time Time(Regex elementId)
 9         {
10             return AllElements.Time(elementId);
11         }
12
13         public virtual Time Time(Constraint findBy)
14         {
15             return AllElements.Time(findBy);
16         }
17
18         public virtual Time Ul(Predicate<Time> predicate)
19         {
20             return AllElements.Time(predicate);
21         }
22
23         public virtual TimeCollection Times
24         {
25             get { return AllElements.Times; }
26         }
27         #endregion
28         #endregion

  e、修改元素容器类ElementContainer.cs,修改此类是为了可以在Div、P、Span等元素中使用。将Time元素操作放入IElementsContainer代码块中。

 1         #region Time
 2         public Time Time(string elementId)
 3         {
 4             return AllElements.Time(elementId);
 5         }
 6
 7         public Time Time(Regex elementId)
 8         {
 9             return AllElements.Time(elementId);
10         }
11
12         public Time Time(Constraint findBy)
13         {
14             return AllElements.Time(findBy);
15         }
16
17         public Time Time(Predicate<Time> predicate)
18         {
19             return AllElements.Time(predicate);
20         }
21
22         public TimeCollection Times
23         {
24             get { return AllElements.Times; }
25         }
26         #endregion

3、验证

Html

 1 <html>
 2 <head>
 3     <meta charset="utf-8">
 4     <title>WatiN测试页面</title>
 5 </head>
 6 <body>
 7     <div id="arborday"><time datetime="2017-03-12">植树节</time></div>
 8     <time datetime="2017-04-01">愚人节</time>
 9 </body>
10 </html>

C#代码

 1         public static string  Test()
 2         {
 3             IE ie = IE.InternetExplorers().FirstOrDefault(p => !string.IsNullOrEmpty(p.Title) && p.Title == "WatiN测试页面");
 4             StringBuilder msg = new System.Text.StringBuilder();
 5             msg.Append("页面中的Time元素\r");
 6             foreach (var item in ie.Times)
 7             {
 8                 msg.Append(item.Text + ":" + item.DateTime + "\r");
 9             }
10             Div dv = ie.Div(Find.ById("arborday"));
11             msg.Append("\rdiv中的Time元素\r");
12
13             foreach (var item in dv.Times)
14             {
15                 msg.Append(item.Text + ":" + item.DateTime + "\r");
16             }
17             return msg.ToString();
18         }

结果:

转载于:https://www.cnblogs.com/xiaoqiangcode/p/6426984.html

WatiN-Html元素及元素属性识别-扩展相关推荐

  1. jQuery(一):概述、选择器、操作(元素本身、属性、内容、样式)、元素遍历、事件

    目录 一.jQuery概述 1.1 什么是jQuery 1.2 jQuery的优势 1.3 jQuery版本支持 1.4 jQuery引入 1.5 jQuery核心用法 1.5.1 $介绍 1.5.2 ...

  2. html常用语义化元素和全局属性整理

    WWW www其实是World Wide Web 的缩写,它是一个由许多互相链接的超文本组成的系统,通过互联网访问, 在汉语中,www 被翻译成(web 万维网 全球广域网). <HTML> ...

  3. html元素的overflow属性详解

    最近更新时间:2018年6月20日11:39:55 <我的博客地图> 最近接手一个老项目,该项目是用EasyReport这个Web报表工具在web页面动态展示数据库数据,在开发调试过程中遇 ...

  4. 文章目录 图片元素 img元素 显示图片的两种写法: alt 属性 与a元素连用 map元素 和figure元素 figcaption 联用

    文章目录 图片元素 img元素 显示图片的两种写法: alt 属性 与a元素连用 map元素 和figure元素 figcaption 联用 图片元素 img元素 image 缩写,空元素 src属性 ...

  5. HTMLDOM中三种元素节点、属性节点、文本节点的测试案例

    HTML dom中常用的三种节点分别是元素节点.属性节点.文本节点. 具体指的内容可参考下图: 以下为测试用例: <!DOCTYPE html> <html><head& ...

  6. angular学习笔记(四)- input元素的ng-model属性

    input元素的ng-model属性: 用于将input的值和变量的值进行双向绑定 <!DOCTYPE html> <html ng-app> <head>< ...

  7. 浮动元素的display属性

    在页面布局的时候,我们经常会将元素设置成浮动效果来解决一些实际问题,无论当前元素是块级元素还是行内元素, 似乎都有需要设置成浮动的时候,但与此同时,我们有没有想过,在元素被设置成浮动之后,他们的blo ...

  8. 元素节点、属性节点、文本节点 的节点属性

    1 .nodeName 元素节点        元素标记名/节点名称, 相当于tagName .属性节点       属性节点返回属性名, 文本节点          文本节点返回#text.node ...

  9. document 获得元素节点,属性节点,文本节点

    document 获得元素节点,属性节点,文本节点. ※Element在w3c xml DOM中,HTML没有. (添加,修改,替换,删除,都在xml dom中) http://www.w3schoo ...

最新文章

  1. Google AI 系统 DeepMind无法通过 高中数学
  2. 智能+制造,聪明的公司都走上了智能制造的道路
  3. 老板用人5大原则,能力绝不是首选!大多数人的想法是错误的
  4. Java Object类中的finalize()方法
  5. 求二叉树最长路径长度和
  6. java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
  7. ASP注入漏洞基础教程(二)
  8. python数据预处理案例_对pandas进行数据预处理的实例讲解
  9. bigdecimal不等于0怎么写_写文章死憋写不出来,怎么破?
  10. python读取文件名包含某字符的文件_python 读写文件时判断文件名是否包含某字符串...
  11. 给ListView视图添加行号
  12. 2017年第六届数学中国数学建模国际赛(小美赛)比赛心得
  13. SHELLEXECUTEINFO 和 ShellExecuteEx的使用
  14. 最坑人的辨色大比拼微信小游戏源码
  15. java毕业实习日志_《Java课程实习》日志(周一)
  16. leetcode【链表—中等】707.设计链表
  17. html网页文本框无法输入,浏览器打开网页文本框无法输入文字如何解决
  18. 合成冷色黑暗恐怖魔法师图片的PS教程
  19. 社保证照片怎么做?一招教你get既专业又好看的证件照!
  20. 移动安全--22--Android应用安全防护技术

热门文章

  1. bat如何执行完上一条命令_一条更新语句是如何执行的?
  2. dis的前缀单词有哪些_英语单词II词根词缀记忆法:必背英语前缀DIS (DI, DIF)
  3. pymysql安装_centos7.6 安装openstack stein组件之四
  4. mapreduce分组统计_如何优雅的理解MapReduce
  5. 10进制小数转化为任意进制小数
  6. 用python生成多个txt文件
  7. torch.Tensor和torch.tensor有什么区别?
  8. win7系统下的打印机不能扫描
  9. 排序算法lowb三人组-插入排序
  10. JAVA - 守护线程(Daemon Thread)