实现当前IE的当前页面截图
2007-11-01 20:01
211 查看
由于最近工作比较忙没什么时间写文章,正好今天抽出点时间来写写博客。说实话做测试真是一个无聊的事情,哪怕它很重要但是真的很无聊。昨天英语课上还有人问什么才是Creative Bug, I think nobody find it expect you. This is the creative bug。总之在微软报bug也事件不容易的事情,特别你是flashman. 不过总是来也半年终于在最近的一个月报了11个bug,体验一把真正测试的feeling。废话少说,进入正题:
最近正在忙一个tool的发布准备,这个tool是一个实习生开发的,走后留给我来开发,其实功能比较简单。大家都知道键盘上有一个PrScrn的键,right! 截屏,我们这个工具也是干这个活的。不过呢不是Capture Screen, 而是Capture IE web page。这个工具的产生也主要是因为我们的automation case中需要这个功能,不过现在my boss want to public it to toolbox(a webstie in microsoft to public tool). 大家知道IE页面有的带滚动条有的不带,如果你通过系统的截屏功能那么只能截取到一部分的页面。What a pity! 不过现在网路上也有这样的工具来截整屏了,但是如果你要用在你的Program里,impossible! 所以我们开发了这样一个接口用于完成这个工作。截屏的原理很简单,
1. 获取页面高度和宽度
2. 截取当前页面的显示部分,画到一个graphic上
3. 滚动页面,重复2,直到结束
4. 保存成图片
这些工作我们可以使用.Net中的Bitmap, Graphic, HDC, IO 还有一些API来完成。
body.setAttribute("scroll", "yes", 0);
int webHeight = (int)body.getAttribute("scrollHeight", 0);
int webWidth = (int)body.getAttribute("scrollWidth", 0);
int screenHeight = (int)body.getAttribute("clientHeight", 0);
int screenWidth = (int)body.getAttribute("clientWidth", 0);
.
.
.
g = Graphics.FromImage(screenFragment);
//handle to the device context
hdc = g.GetHdc();
body.setAttribute("scrollTop", (screenHeight - 5) * i, 0);
brwTop = (int)body.getAttribute("scrollTop", 0);
//copies a visual window into the specified device context(DC)
//hwnd - Handle to the window that will be copied
//hdc - Handle to the device context
//0 - specifies the drawing options.
IntPtr hPageWin = hCurDisWin;
IEAttachAssist.PrintWindow(hPageWin, hdc, 0);
g.ReleaseHdc(hdc);
g.Flush();
screenFrag = Image.FromHbitmap(screenFragment.GetHbitmap());
try
catch (System.ArgumentNullException ex)
.
.
.这里是一部分代码片段。
比较麻烦的是,如何获取当前显示的浏览器还要兼容IE6和IE7。因为IE6是没有Tab页面标签的而IE7有。So, how do it?
还有对于html和DTD 声明的html处理的方式也是不一样的,这也是个问题。而我碰到最最麻烦的问题是在IE7里对每一个Tab页面都是一个单独的WebBroswer对象,但是呢,他们的ShellWindow句柄是一样的。如何获取当前显示页面句柄和对应的HtmlDocument?
这两天搞的我是头昏眼花,不过努力没有白费,问题逐一解决。So, next I will explain how to resolve these problem.
first. 兼容IE6和IE7? 这个问题主要是因为IE6的Window handle tree结构和IE7的不同。我通过编写各自的函数来解决,同时你要在架构是解决对象调用的透明性,我使用了工厂模式。
以下是获取IE7当前显示窗口句柄函数:
static public IntPtr GetCurPageFromTabWindow(IntPtr handle, ref StringBuilder title)
static public bool IsDTDDocument(object document)
static public IntPtr GetActiveIEHandle()
static private IntPtr GetProcessMainWindowHandle(string title)
Process[] curProcesses = Process.GetProcesses();
foreach (Process p in curProcesses)
if (p.MainWindowTitle.Contains(title))
return p.MainWindowHandle;
}
return IntPtr.Zero;
}
通过这次的开发,确实对IE对网页的处理加深了不少认识。同时我也发现了firefox的缺点,就是很难在程序中去操作firefox。how terrible!
希望这篇文章对大家有帮助。
这里是一个Demo工程,编译环境是.net2.0.
最近正在忙一个tool的发布准备,这个tool是一个实习生开发的,走后留给我来开发,其实功能比较简单。大家都知道键盘上有一个PrScrn的键,right! 截屏,我们这个工具也是干这个活的。不过呢不是Capture Screen, 而是Capture IE web page。这个工具的产生也主要是因为我们的automation case中需要这个功能,不过现在my boss want to public it to toolbox(a webstie in microsoft to public tool). 大家知道IE页面有的带滚动条有的不带,如果你通过系统的截屏功能那么只能截取到一部分的页面。What a pity! 不过现在网路上也有这样的工具来截整屏了,但是如果你要用在你的Program里,impossible! 所以我们开发了这样一个接口用于完成这个工作。截屏的原理很简单,
1. 获取页面高度和宽度
2. 截取当前页面的显示部分,画到一个graphic上
3. 滚动页面,重复2,直到结束
4. 保存成图片
这些工作我们可以使用.Net中的Bitmap, Graphic, HDC, IO 还有一些API来完成。
body.setAttribute("scroll", "yes", 0);
int webHeight = (int)body.getAttribute("scrollHeight", 0);
int webWidth = (int)body.getAttribute("scrollWidth", 0);
int screenHeight = (int)body.getAttribute("clientHeight", 0);
int screenWidth = (int)body.getAttribute("clientWidth", 0);
.
.
.
g = Graphics.FromImage(screenFragment);
//handle to the device context
hdc = g.GetHdc();
body.setAttribute("scrollTop", (screenHeight - 5) * i, 0);
brwTop = (int)body.getAttribute("scrollTop", 0);
//copies a visual window into the specified device context(DC)
//hwnd - Handle to the window that will be copied
//hdc - Handle to the device context
//0 - specifies the drawing options.
IntPtr hPageWin = hCurDisWin;
IEAttachAssist.PrintWindow(hPageWin, hdc, 0);
g.ReleaseHdc(hdc);
g.Flush();
screenFrag = Image.FromHbitmap(screenFragment.GetHbitmap());
try
catch (System.ArgumentNullException ex)
.
.
.这里是一部分代码片段。
比较麻烦的是,如何获取当前显示的浏览器还要兼容IE6和IE7。因为IE6是没有Tab页面标签的而IE7有。So, how do it?
还有对于html和DTD 声明的html处理的方式也是不一样的,这也是个问题。而我碰到最最麻烦的问题是在IE7里对每一个Tab页面都是一个单独的WebBroswer对象,但是呢,他们的ShellWindow句柄是一样的。如何获取当前显示页面句柄和对应的HtmlDocument?
这两天搞的我是头昏眼花,不过努力没有白费,问题逐一解决。So, next I will explain how to resolve these problem.
first. 兼容IE6和IE7? 这个问题主要是因为IE6的Window handle tree结构和IE7的不同。我通过编写各自的函数来解决,同时你要在架构是解决对象调用的透明性,我使用了工厂模式。
以下是获取IE7当前显示窗口句柄函数:
static public IntPtr GetCurPageFromTabWindow(IntPtr handle, ref StringBuilder title)
static public bool IsDTDDocument(object document)
static public IntPtr GetActiveIEHandle()
static private IntPtr GetProcessMainWindowHandle(string title)
Process[] curProcesses = Process.GetProcesses();
foreach (Process p in curProcesses)
if (p.MainWindowTitle.Contains(title))
return p.MainWindowHandle;
}
return IntPtr.Zero;
}
通过这次的开发,确实对IE对网页的处理加深了不少认识。同时我也发现了firefox的缺点,就是很难在程序中去操作firefox。how terrible!
希望这篇文章对大家有帮助。
这里是一个Demo工程,编译环境是.net2.0.
相关文章推荐
- 如何用js实现,在一个页面有个输入文档框,然后点击查询按扭后,调用IE的查询功能在当前页面进行查询
- 利用IE 实现Web 页面截图
- JavaScript实现页面实时显示当前时间的简单实例
- 【原】关于如何在Master Page中实现当前激活项与页面相对应
- PHP Global变量定义当前页面的全局变量实现探讨
- 在Web页面中实现数据表格的排序功能(全部数据,非当前页)
- 微信会员注册开发【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
- JS实现点击图片在当前页面放大的漂亮效果
- 在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口
- 用JQUERY实现给当前页面导航一个CSS
- Javascript获得当前网页页面详细地址的实现
- 用jQuery实现当前页面给菜单导航一个特定样式(转载)
- JavaScript实现页面加载成功后刷新一遍当前页面(一)
- php实现当前页面点击下载文件的实例代码
- js 实现页面时间与当前时间同步
- JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
- 解决C# 截取当前程序窗口指定位置截图的实现方法
- 在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
- iframe实现无刷新上传文件并在当前页面返回数据php处理方式
- JS实现重新加载当前页面或者父页面的几种方法