• C#】通过遍历IFrame访问页面元素


    最近在做一个小项目,期间需要用到C#去操作IE页面中的元素,实现自动填写表单并且提交的功能,想这网上关于这方面的东西肯定很多,于是开始在网上找资料。

    在逆心的博客上找到些东西对自己帮助很大,原文链接:http://www.cnblogs.com/kissdodog/p/3725774.html

    1.首先添加必须的两个控件的引用

    Microsoft Internet Controls
    Microsoft HTML Object Library

    2.遍历所有的IE窗口

    SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
    foreach (InternetExplorer Browser in shellWindows)
    {
    if (Browser.Document is HTMLDocument && Browser.LocationURL.Contains("ra207.com"))
    {
    mshtml.IHTMLDocument2 doc2 = (mshtml.IHTMLDocument2)Browser.Document;
    //...
    }
    }


    3.通过DOM操作IE页面
    mshtml.IHTMLElementCollection inputs = (mshtml.IHTMLElementCollection)doc2.all.tags("INPUT");
    mshtml.HTMLInputElement input1 = (mshtml.HTMLInputElement)inputs.item("kw1", 0);
    input1.value = "test";
    mshtml.IHTMLElement element2 = (mshtml.IHTMLElement)inputs.item("su1", 0);
    element2.click();


    4.遍历操作IFrame中的元素

    很不巧的是原作者也没有实现直接对IFrame中元素的操作,在网上找了很久也没有找到相关的文章,没有办法,只能自己搞了。

    分析网页结构,是多层IFrame相互嵌套的复杂结构,并且上层是无法获取子层的元素的,真是麻烦~

    后来转念一想,既然是多层嵌套,那不正好可以用递归来实现么,遍历所有的IFrame应该可行,暴力美学~

    //遍历IFrame
    public static bool FramesRecursion(ref IHTMLWindow2 frame)
    {
    IHTMLDocument2 frameDoc = frame.document;
    if (null == frameDoc) return false;
    if (null == frameDoc.body.innerHTML) return false;

    if (frameDoc.body.innerHTML.Contains("确定交易")) //找到目标
    {
    FindAndClickTheButton(ref frame); //操作目标
    return true;
    }
    //遍历该IFrame包含的所有子IFrame
    IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)frameDoc.frames;
    int len = frames.length;
    if (len <= 0) return false;
    object i = 0;
    object olen = len;
    while ((int)i < (int)olen)
    {
    IHTMLWindow2 frame2 = frames.item(ref i) as IHTMLWindow2;
    if (FramesRecursion(ref frame2))
    return true;
    i = (object)((int)i + 1);
    }
    return false;
    }

    最后打包程序的时候需要这两个库对应的Dll放在exe同一个目录下面,否则很可能因为dll版本的不同造成不报错的失败。
    ---------------------

  • 相关阅读:
    MySQL性能优化
    mysql中OPTIMIZE TABLE的作用
    Linux中/usr与/var目录详解
    Mysql之EXPLAIN显示using filesort
    MySQL ALTER语法的运用方法 && 操作索引和字段
    NoSQL数据库的分布式算法&&memcache集群的实现
    linux用户权限
    hdoj1241 Oil Deposits
    ny42 一笔画问题
    ny20 吝啬的国度
  • 原文地址:https://www.cnblogs.com/soundcode/p/10918244.html
Copyright © 2020-2023  润新知