想实现的功能:              1:有一个网页(不是我自己的,是cmcc_edu登录页面),里面有登陆框,一个是用户名,
                 一个是密码,下面有一登录按钮。
              2:我想编写一个程序,自动填写用户名和密码,并点提交。
              3:并且具有定时功能,时间到后,点击网页里的下线按钮。实现工具: MFC我做的方法:我是用WebBrowser2接口来实现的,过程如下:
            
             1:IWebBrowse2 得到IHTMLDocument2指针,             2:IHTMLDocument2指针得到IHTMLElementCollection,             3:IHTMLElementCollection的item方法遍历得到IHTMLElement指针,             4:从IHTMLElement的InnerText等方法判断是不是该链接                或者从IHTMLElementCollection的Tags方法得到所有的出现的问题:
 
             按照上面的思路,我能实现在百度首页的文本框输入内容,并点击搜索按钮。             但是,当我去匹配我指定那个页面(cmcc_edu)的 文本框的 id或者name一直失败。             我怀疑是因为这个网站是用javascript写的,不能简单匹配文本框的id和name。
贴出这个网页登陆框的代码:
               <input id="Wp_user class="Wp_text" value="移动手机号" type="text"
                name="username onclick='swap_name_content0()' 
                onblur='swap_name_content1()' maxlength="22"/>百度文本框的代码:
                <input type="text" name="wd" id="kw" maxlength="100" class="s_ipt">
求大虾给出问题的原因及解决方案,万分感谢!

解决方案 »

  1.   

    CComQIPtr<IWebBrowser2> spBrowser = (IWebBrowser2 *)this->m_pBrowserApp;
    if (spBrowser){ CComPtr< IDispatch > spDisp;
    HRESULT hr = spBrowser->get_Document( &spDisp );
    IHTMLDocument2 *pDoc2 = NULL;
    if (FAILED(hr))
    return;

    // m_pDoc2是IHTMLDocument2指针类型
    hr = spDisp->QueryInterface(IID_IHTMLDocument2, (void **)&pDoc2);
    if (SUCCEEDED(hr))
    {
    IHTMLElementCollection *pCollection = NULL;
    hr = pDoc2->get_all(&pCollection);
    if (SUCCEEDED(hr))
    {
    long lCount = 0;
    pCollection->get_length(&lCount);
    for(long i = 0;i<lCount;i++)
    {
    IDispatch *pDisp = NULL;
    IHTMLElement* pElement=NULL;
    VARIANT vtItem;
    vtItem.vt = VT_I4;
    vtItem.intVal = i;
    pCollection->item(vtItem,CComVariant(), &pDisp);
    HRESULT hRes = pDisp->QueryInterface(IID_IHTMLElement, (void**)&pElement);
    if (SUCCEEDED(hRes))
    {
    BSTR bstrId;
    pElement->get_id(&bstrId);
    SysFreeString(bstrId);
    pElement->Release();
    }
    pDisp->Release(); }
    pCollection->Release();
    }
    }
    spDisp.Release();
    }
    可以查找到那个ID的,当然,如果框架frame是嵌套的,可能得遍历框架frame,这个没有试验过
      

  2.   

    cmcc一般都有frame的
    先获取主页面的Document2
    然后调用这个函数
    IHTMLDocument2 * EnumFrame( IHTMLDocument2 *pHTML)
    {
    CComQIPtr<IOleContainer> spContainer( pHTML );
    if( spContainer )
    {
    CComPtr<IEnumUnknown> spEnumerator; // 注:参数OLECONTF_EMBEDDINGS // 表示列举容器内的所有嵌入对象 
    HRESULT hr = spContainer->EnumObjects(OLECONTF_EMBEDDINGS, &spEnumerator);
    if( spEnumerator )
    {
    CComPtr<IUnknown> spUnk;
    while (spEnumerator->Next(1, &spUnk, NULL) == S_OK)
    {
    CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> spWB(spUnk);
    spUnk=NULL;
    if ( spWB )
    { CComPtr<IDispatch> spDocDisp;
    hr = spWB->get_Document(&spDocDisp); 
    CComQIPtr<IHTMLDocument2> spHTML (spDocDisp); BSTR bstrURL;
    spWB->get_LocationURL(&bstrURL);
    CString strURL(bstrURL);
    if ( -1 != strURL.Find("frame的URL地址") ) //找到登录的IFrame
    {
    IHTMLDocument3 *pDoc3 = NULL;
    spHTML->QueryInterface(IID_IHTMLDocument3, (void **)&pDoc3);
    if (!pDoc3 && FAILED(hr)) return 0; CComPtr<IHTMLElement> pUserElement;
    CComPtr<IHTMLElement> pPswElement;
    CComPtr<IHTMLElement> pLoginElement;
    //获取ID为 txtUserID 的元素
    CComBSTR idName(CT2OLE(_T("txtUserID")));
    hr = pDoc3->getElementById(idName, &pUserElement);
    if (FAILED(hr) ||!pUserElement ) return 0;
    pUserElement->put_innerText(CComBSTR("username")); //获取ID为 txtPwd 的元素
    CComBSTR idPsw(CT2OLE(_T("txtPwd")));
    hr = pDoc3->getElementById(idPsw, &pPswElement);
    if (FAILED(hr) ||!pPswElement )return 0;
    pPswElement->put_innerText(CComBSTR("password")); //获取ID为 ibtn_Login 的元素
    CComBSTR idLogin(CT2OLE(_T("ibtn_Login")));
    hr = pDoc3->getElementById(idLogin, &pLoginElement);
    if (FAILED(hr) ||!pLoginElement )return 0;
    pLoginElement->click();
    //return spHTML;
    }
    EnumFrame( spHTML);
    return spHTML; }
    }
    }
    }
    }