想实现的功能: 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">
求大虾给出问题的原因及解决方案,万分感谢!
一个是密码,下面有一登录按钮。
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">
求大虾给出问题的原因及解决方案,万分感谢!
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,这个没有试验过
先获取主页面的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; }
}
}
}
}