如何访问 IHTMLDocument2 中不同域名下拒绝访问的 frames 对象 -- COM ERROR_(E_ACCESSDENIED)

    两年半以前面试重庆某公司,她的主要产品产品为.NET开发的BI 和 C++开发的游戏. 本来面试的游戏设计,但未通过.正好朋友负责公司的测试部门管理并需要开发自动化测试工具,询问我是否有意. 偶辞职在家的几个月四处徒步旅游,玩,吃喝,钱包瘪了:) 加待遇在重庆来说也还可以就答应下来,这里要感谢朋友Crunch和公司给予的机会.
   
    要实现 WEB 应用程序自动化测试,可以通过记录 http 请求并重放和统计各种指标来实现,也可以象 WIN32 应用一样捕获相应的 html element 产生相应事件来实现.自动化测试可以减轻测试部门的工作压力.

    下面说说捕获 html element 和问题   
    捕获可见的 Microsoft Explorer (IE) 组件可以用以下方法:
    得到当前窗口句柄,并向此窗口发送 WM_HTML_GETOBJECT 消息, IE会返回 IHTMLDocument2 COM 指针到发送者. 有了 IHTMLDcoument2 指针,我们就可以做很多事情,如模拟 Document 对象中一个子对象的鼠标按下操作,还可以检测到是 Document 中子对象是否是我们所需要的值.甚至可以捕获 IE 的HTTP 请求.如今已离开这个公司, 前段时间在MSN上碰到以前公司的同事, 谈起不同域名下拒绝访问 frames 对象的问题,并想有解决办法.

    问题:
    当 Document 对象中包含多个 frames 的时候,直接通过 IHTMLDocument2.frames 或者 IHTMLFrameBase 或者 IHTMLWindow2 都不能访问不同不同域名下 frame 对象. 这个看起来是乎可以防止恶意的网站行为.但对我们测试也带来麻烦.

    解决问题的方法其实很简单,如下:
       
    (这个方法来源于国外的一个开发者论坛,解答者只是给出了微软关于获得HTML文档框架的连接 (见附录),没有其他的说明,我找不到那个地址了,不好意思.)

    我们知道通过 IHTMLDcoument2 对象可以得到 IContainer 对象, 而 IContainer 对象包含当前 HTMLDocument2 对象中所有子对象的 IWebBrowser2 对象,访问 IWebBrowser2 对象中 IHTMLDocument2 对象就是我们需要的 frame 对象包含的 IHTMLDocument2 对象. 那么对于每个子 IWebBrowser2 对象如何判断它属于哪个 frame 呢? 只需要比较 IHTMLFrameBase 和子 IWebBrowser2 对象的 IUnknown 指针地址是否相等就可以了.
   
    上面的叙述有些复杂,可用 C# 描述获得第一个子 IHTMLDocument2 对象,如下:   
    
    输入参数为当前 Document, 和 Document 中所有的 frame 的 IHTMLFrameBase2 对象.

  

    
    IHTMLDocument2 GetSubFrameDocument2 (IHTMLDocument2 Document2Base, ArrayList FrameBaseList)
    {    
        
object  Unknown;
        
uint    fetched;

        IContainer Container    
=  Document2Base  as  IContainer;
        
if  ( null   ==  Container)
        {
            
//  错误处理
            
//  ......
            
//  ...
             return   null ;
        }

        IEnumUnknown Enumerator 
=  Container  as  IEnumUnknown;
        
if  ( null   ==  Enumerator)
        {
            
//  错误处理
            
//  ......
            
//  ...
             return   null ;
        }

        Enumerator.RemoteNext (
1 out  Unknown,  out  fetched);

        
if  ( null   ==  Unknown)  return   null //  没有子对象
    
        IWebBrowser2 Browser2 
=  Unknown  as  IWebBrowser2;
        
if  ( null   ==  Browser2)
        {
            
//  错误处理
            
//  ......
            
//  ...
             return   null ;
        }
    
        
foreach  (IHTMLFrameBase2 FrameMember  in  FrameBaseList)
        {
            
if  (FrameMember  ==  (Browser2  as  IHTMLFrameBase2))         
            {
                
//  找到匹配子对象
                 return  Browser2.document  as  IHTMLDocument2;
            }                
        }  

        
return   null ;  
    }

    如果您使用其他编程语言稍微修改即可.

    附录:
   
    微软关于获得HTML文档框架的连接
    http://support.microsoft.com/kb/196340

    我的资源中有一个HTML 组件捕获工具可以下载

   源码见:

   http://download.csdn.net/source/203661

   另: SharpDevelop 真是个好C#开源开发工具,谢谢

    22:55 2007-6-30 晚于重庆家中 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值