HtmlAutoTestFrameWork

前段时间做的自动化测试的是Silverlight的,框架都已经搭好。突然测试发现这里还有一个要发送邮件的html页面,并且将另外启动浏览器,于是今天下午把这个html的也写出来。

用法 :

HtmlAutoTestFrameWork htf = new HtmlAutoTestFrameWork();
htf.BrowserDefaultIE();

 HtmlTextArea heTo2 = htf.ByPropert<HtmlTextArea>("Id:input-to;TagName:TEXTAREA;Class:text");

heTo2.Text = "admin@cnblogs.com";

HtmlButton hbSend = htf.ByPropert<HtmlButton>("Id:btnSend;TagName:INPUT;ControlType:Button");
Mouse.Click(hbSend);

下面是html的一个弹出层,用的jsalert.js .获取弹出层元素

HtmlDiv htmlDiv = htf.ByPropert<HtmlDiv>("Id:popup_container;Class:ui-draggable");

这是弹出层得一个按钮

HtmlInputButton hbok = htf.ByPropert<HtmlInputButton>("Id:popup_ok;Type:button");
Mouse.Click(hbok);

 

下面是源码供参考

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UITesting;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UITesting.HtmlControls;
using System.Diagnostics;
using System.Reflection;namespace autoUI
{public class HtmlAutoTestFrameWork{private string m_uri = string.Empty;private BrowserWindow browser;public HtmlDocument htmlDoc;public string Title = string.Empty;public string AbsolutePath = string.Empty;public string ClassName = string.Empty;public string FrameDocument = string.Empty;#region HtmlDocumentpublic void BrowserLaunch(){}public void BrowserLaunch(String Url){m_uri = Url;browser = BrowserWindow.Launch(Url);BuildParams();}private void BuildParams(){browser.SearchProperties[UITestControl.PropertyNames.ClassName] = "IEFrame";htmlDoc = new Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlDocument(browser);if (!string.IsNullOrWhiteSpace(m_uri))htmlDoc.SearchProperties[Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlDocument.PropertyNames.PageUrl] = m_uri;if (!string.IsNullOrWhiteSpace(Title))htmlDoc.SearchProperties[Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlDocument.PropertyNames.Title] = Title;if (!string.IsNullOrWhiteSpace(AbsolutePath))htmlDoc.SearchProperties[Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlDocument.PropertyNames.AbsolutePath] = AbsolutePath;if (!string.IsNullOrWhiteSpace(ClassName))htmlDoc.SearchProperties[Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlDocument.PropertyNames.ClassName] = ClassName;if (!string.IsNullOrWhiteSpace(FrameDocument))htmlDoc.SearchProperties[Microsoft.VisualStudio.TestTools.UITesting.HtmlControls.HtmlDocument.PropertyNames.FrameDocument] = FrameDocument;}public void BrowserDefaultIE(){browser = BrowserWindow.FromProcess(GetProcess("iexplore"));BuildParams();}public void BrowserFromProcess(Process p){browser = BrowserWindow.FromProcess(p);BuildParams();}public Process GetProcess(string browerType){Process p = Process.GetCurrentProcess();List<Process> list = new List<Process>();foreach (var item in Process.GetProcesses()){if (item.ProcessName.Equals(browerType,StringComparison.CurrentCultureIgnoreCase)){list.Add(item);}}list.Sort((a, b) =>{return a.TotalProcessorTime.CompareTo(b.TotalProcessorTime);});//浏览器启动时间排序return list[0];//返回浏览器启动用时最少的
       }#endregion#region Findprivate T GetControl<T>(HtmlControl hc) where T : HtmlControl{T to = null;try{Type t = typeof(T);var types = new Type[1];types[0] = typeof(HtmlControl);ConstructorInfo ci = t.GetConstructor(types);var obj = new object[1];obj[0] = hc;to = (T)ci.Invoke(obj);}catch{to = default(T);}return to;}public T ByID<T>(string id) where T : HtmlControl{return ByID<T>(htmlDoc, id);}public T ByID<T>(HtmlControl hc, string id) where T : HtmlControl{return GetHtmlControlByProperty<T>(hc, "Id:"+id);}/// <summary>///Get Control By Propert. eg HtmlDiv hd=f.ByPropert<HtmlDiv>("Id:IdValue;Name:NamaValue")/// </summary>/// <typeparam name="T">ControlType</typeparam>/// <param name="attributeValue">Id:IdValue;Name:NamaValue</param>/// <returns>T</returns>public T ByPropert<T>(string propertyValue) where T : HtmlControl{return ByPropert<T>(htmlDoc, propertyValue);}public T ByPropert<T>(HtmlControl hc, string propertyValue) where T : HtmlControl{return GetHtmlControlByProperty<T>(hc, propertyValue);}public T GetHtmlControlByProperty<T>(HtmlControl hc, string propertyValue) where T: HtmlControl{T t = GetControl<T>(hc);try{if (!string.IsNullOrWhiteSpace(propertyValue)){string[] arr1 = propertyValue.Split(';');for (int i = 0; i < arr1.Length; i++){string[] arr2 = arr1[i].Split(':');t.SearchProperties[arr2[0]] = arr2[1];}}}catch { }return t;}#endregionpublic void Close(){browser.Close();Thread.Sleep(5000);}}
}

 

  

转载于:https://www.cnblogs.com/jiebian/archive/2012/11/30/2796406.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L8ER的完整形式是什么?

L8ER&#xff1a;稍后 (L8ER: Later) L8ER is an abbreviation of "Later". L8ER是“ Later”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Facebook, Yahoo Messenger, and Gmail, etc…

Randomize select algorithm 随机选择算法

从一个序列里面选择第k大的数在没有学习算法导论之前我想最通用的想法是给这个数组排序&#xff0c;然后按照排序结果返回第k大的数值。如果使用排序方法来做的话时间复杂度肯定至少为O&#xff08;nlgn&#xff09;。 问题是从序列中选择第k大的数完全没有必要来排序&#xff…

《Linux杂记:一》

目录CPU负载和CPU利用率CPU负载很高,利用率却很低的情况负载很低,利用率却很高常用linux命令常用的文件、目录命令常用的权限命令常用的压缩命令CPU负载和CPU利用率 可以通过 uptime , w 或者 top 命令看到CPU的平均负载。 Load Average :负载的3个数字,比如上图的0.57、0.4…

IOS Plist操作

代码&#xff1a;copy BUNDLE下的plist文件 到 library下面。 bundle下不支持些&#xff0c;library&#xff0c;doc路径支持读与写。 (void)copyUserpigListToLibrary {NSFileManager *fileManager [NSFileManager defaultManager];NSArray *paths NSSearchPathForDirector…

《线程管理:线程基本操作》

目录线程管理启动线程与&#xff08;不&#xff09;等待线程完成特殊情况下的等待&#xff08;使用trycath或rall&#xff09;后台运行线程线程管理 启动线程与&#xff08;不&#xff09;等待线程完成 提供的函数对象被复制到新的线程的存储空间中&#xff0c;函数对象的执行…

scala特质_Scala的特质

scala特质Scala特质 (Scala traits) Traits in Scala are like interfaces in Java. A trait can have fields and methods as members, these members can be abstract and non-abstract while creation of trait. Scala中的特性类似于Java中的接口 。 特征可以具有作为成员的…

优化PHP代码的40条建议(转)

优化PHP代码的40条建议 40 Tips for optimizing your php Code 原文地址&#xff1a;http://reinholdweber.com/?p3 英文版权归Reinhold Weber所有&#xff0c;中译文作者yangyang&#xff08;aka davidkoree&#xff09;。双语版可用于非商业传播&#xff0c;但须注明英文版作…

Iptables入门教程

转自&#xff1a;http://drops.wooyun.org/tips/1424 linux的包过滤功能&#xff0c;即linux防火墙&#xff0c;它由netfilter 和 iptables 两个组件组成。 netfilter 组件也称为内核空间&#xff0c;是内核的一部分&#xff0c;由一些信息包过滤表组成&#xff0c;这些表包含内…

《线程管理:传递参数、确定线程数量、线程标识》

参考《c Concurrency In Action 》第二章做的笔记 目录传递参数量产线程线程标识传递参数 thread构造函数的附加参数会拷贝至新线程的内存空间中&#xff0c;即使函数中的采纳数是引用类型&#xff0c;拷贝操作也会执行。如果我们期待传入一个引用&#xff0c;必须使用std::re…

手把手玩转win8开发系列课程(14)

这节的议程就是——添加appbar appbar是出现在哪儿了&#xff0c;出现在屏幕的底部。他能使用户能用手势或者使用鼠标操作程序。metro UI 重点是在主要的控件使用许多控件&#xff0c;使其用户使用win8电脑更加的方便。而appBar使其用户体验更好。在这节中&#xff0c;我将告诉…

No identities are available for signing 的解决办法

今天重新上传做好的app提交到app store&#xff0c;结果就出现标题上的错误。“No identities are available for signing”。 以后碰到这样的问题按照下面几个步骤来做&#xff1a; 进入Distribution -----下载发布证书 -----双击安装-----重启Xcode就能上传了 其他细节 如果再…

半连接反连接

半连接&反连接 1. 半连接 半连接返回左表中与右表至少匹配一次的数据行&#xff0c;通常体现为 EXISTS 或者 IN 子查询。左表驱动右表。只返回左表的数据&#xff0c;右表作为筛选条件。 可以用 EXISTS、 IN 或者 ANY 举例&#xff1a;表t1和表t2做半连接&#xff0c;t…

匿名方法和Lambda表达式

出于MVVM学习的需要&#xff0c;复习下匿名方法和Lambda表达式&#xff0c;因为之前用的也比较少&#xff0c;所以用的也不是很熟练&#xff0c;Baidu下相关的知识&#xff0c;写了这个Demo&#xff0c;目标是用简单的方法展示这个怎么用。 这里偏重的和LINQ中的Lambda表达式 …

烂橘子

Problem Statement: 问题陈述&#xff1a; Given a matrix of dimension r*c where each cell in the matrix can have values 0, 1 or 2 which has the following meaning: 给定尺寸r * C的矩阵&#xff0c;其中矩阵中的每个单元可以具有其具有以下含义的值0&#xff0c;1或2…

android junit 测试程序

http://blog.csdn.net/to_cm/article/details/5704783 Assert.assertEquals(2, t); 断言转载于:https://www.cnblogs.com/wjw334/p/3714120.html

MySQL 8.0.22执行器源码分析HashJoin —— BuildHashTable函数细节步骤

BuildHashTable函数细节步骤 该函数位置处于hash_join_iterator.cc 403 ~ 560行 step1&#xff1a;如果被驱动表迭代器没有更多的行数&#xff0c;更新m_state为EOR&#xff0c;然后返回false&#xff0c;表明创建hash表失败 if (!m_build_iterator_has_more_rows) {m_state…

《那些年啊,那些事——一个程序员的奋斗史》——125

距离离职交接的一个月时间还剩几天&#xff0c;本来应该是平淡无事的&#xff0c;却没想到最后还是波澜四起。昨天下班前&#xff0c;公司突然停了电。这本是件普通得不能再普通的事情&#xff0c;可没想到过了一会来电了&#xff0c;或许是波峰电压太大&#xff0c;或许是稳压…

python中的元类_Python中的元类

python中的元类Python元类 (Python metaclass) A metaclass is the class of a class. A class defines how an instance of a class i.e.; an object behaves whilst a metaclass defines how a class behaves. A class is an instance of a metaclass. 元类是类的类。 一个类…

MySQL 8.0.22执行器源码分析HashJoin —— 一些初始化函数的细节步骤

目录InitRowBuffer&#xff08;101行~126行&#xff09;InitProbeIterator&#xff08;142行~153行&#xff09;*HashJoinIterator* 的Init&#xff08;155行~240行&#xff09;InitializeChunkFiles&#xff08;364行~401行&#xff09;InitWritingToProbeRowSavingFile&#…

c语言的宏定义学习笔记

宏定义 在预处理之前&#xff0c;c预处理器会对代码进行翻译&#xff0c;譬如用blank替换注释&#xff0c;去掉多余的空格&#xff0c;删除末尾的\来拼接行等。 例如&#xff1a; int /*注释*/ x; 会被翻译成 int x; printf("this is a s\ entence."); 会被翻译成 pr…