接上一篇文章内容,本篇文章将讲解如何使用Webbrowser 操作HTML页面
二、对HTML页面元素的操作
(1) Input 值设置
xny::Integer SetInputText(LPCTSTR lpInputName, LPCTSTR lpText, LPCTSTR lpParentName, LPCTSTR lpPopFrameName)
{
xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
do
{
if (m_pWebBrowserEx == NULL ) break;
CComPtr pElement = NULL;
if (lpPopFrameName)
{
CComPtr pIFrame = (IHTMLIFrameElement*)m_pWebBrowserEx->GetElementByName(lpPopFrameName, lpParentName, IID_IHTMLIFrameElement);
if (pIFrame == NULL ) break;
pElement = (IHTMLElement *)m_pWebBrowserEx->GetElementByName(lpInputName,pIFrame, IID_IHTMLElement);
}
else
{
pElement = (IHTMLElement *)m_pWebBrowserEx->GetElementByName(lpInputName, lpParentName, IID_IHTMLElement);
}
if (pElement == 0) break;
//转换成CComBSTR
CComBSTR bStr = lpText;
//输入内容
pElement->put_innerText(bStr);
nRet = nsny::eProbeErr::NYERR_SUCCESS;
} while (0);
return nRet;
}
(2) Select选择
xny::Integer SelectOption(LPCTSTR lpOptionName, bool bIsSelect, LPCTSTR lpParentName )
{
xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
do
{
if (m_pWebBrowserEx == NULL ) break;
CComPtr pElement = NULL;
pElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByTag(lpOptionName, _T("input"), _T("id"), lpParentName, IID_IHTMLElement);
if (pElement == NULL ) break;
VARIANT va;
va.vt = VT_BOOL;
va.boolVal = bIsSelect;
nRet = pElement->setAttribute(L"checked", va);
//此处需要主动响应点击事件否则只会有显示效果
VARIANT params[10];
VARIANT ret;
HRESULT hRet = CWebBrowserEx::InvokeMethod(pElement, _T("onclick"), &ret, params, 0);
if (FAILED(hRet)) break;
VariantClear(&va);
} while (0);
return nRet;
}
(3) Combo选择
xny::Integer SelectCombo(LPCTSTR lpCmboName, int nIndex, LPCTSTR lpParentName )
{
xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
do
{
if (m_pWebBrowserEx == NULL ) break;
CComPtr pElement = NULL;
pElement = (IHTMLSelectElement*)m_pWebBrowserEx->GetElementByName(lpCmboName, lpParentName, IID_IHTMLSelectElement);
if (pElement == NULL) break;
long lLen = 0;
HRESULT hRet = pElement->get_length(&lLen);
if (FAILED(hRet)) break;
for (int i = 0; i < lLen; i++)
{
if (i != nIndex)continue;
CComPtr pItem;
CComDispatchDriver spInputElement; //取得第 i 项
hRet = pElement->item(CComVariant(i), CComVariant(i), &spInputElement);
if (FAILED(hRet)) continue;
hRet = spInputElement->QueryInterface(IID_IHTMLOptionElement, (void**)&pItem);
if (FAILED(hRet)) continue;
pItem->put_selected(TRUE);
}
//此处需要主动响应onchange 消息,否则不会自动触发
VARIANT params[10];
VARIANT ret;
hRet = CWebBrowserEx::InvokeMethod(pElement, _T("onchange"), &ret, params, 0);
if (FAILED(hRet)) break;
nRet = nsny::eProbeErr::NYERR_SUCCESS;
} while (0);
return nRet;
}
(4) Table 插入数据到tBody
xny::Integer InstertTableElement(LPCTSTR lpTabName, TABLE_INFO& info, LPCTSTR lpParentName)
{
xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
do
{
if (m_pWebBrowserEx == NULL ) break;
CComPtr pElement = NULL;
pElement = (IHTMLTable*)m_pWebBrowserEx->GetElementByName(lpTabName, lpParentName, IID_IHTMLTable);
if (pElement == NULL ) break;
//清理
CComPtr pBody;
HRESULT hr = pElement->get_tBodies(&pBody);
if (FAILED(hr)) break;
long lNum = 0;
pBody->get_length(&lNum);
CComPtr node_tdnum = NULL;
for (int i = 0; i < lNum; i++)
{
CComDispatchDriver spInputElement; //取得第 i 项
HRESULT hr = pBody->item(CComVariant(i), CComVariant(i), &spInputElement);
if (FAILED(hr))continue;
CComPtr pItem;
hr = spInputElement->QueryInterface(IID_IHTMLElement, (void**)&pItem);
if (FAILED(hr)) continue;
BSTR strName;
pItem->get_outerHTML(&strName);
OutputDebugString(strName);
hr = pItem->QueryInterface(IID_IHTMLDOMNode, (void**)&node_tdnum);
}
if (node_tdnum == NULL ) break;
CComPtr pHtmlDoc2 = NULL;
CComPtr dispatch;
hr = m_pWebBrowserEx->GetWebBrowser2()->get_Document(&dispatch);
if (!FAILED(hr) && dispatch)
{
hr = dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&pHtmlDoc2);
}
if (FAILED(hr)) break;
nRet = CreateTabElement(pHtmlDoc2, node_tdnum, info, lNum);
} while (0);
return nRet;
}
(5) 创建HTML节点元素
xny::String CreateTabElement(CComPtr pHtmlDoc2, IHTMLDOMNode* pParent, TABLE_INFO& info, int nCurIndex)
{
HRESULT hRet = S_FALSE;
std::map mpAttr;
xny::String strRetXml;
do
{
if (pHtmlDoc2 == NULL ) break;
if (pParent == NULL ) break;
std::map mpData;
xny::String strRetHtml;
CComPtr pNode_Main = CreateHtmlNode(pHtmlDoc2, _T("tr"), mpData, NULL, strRetHtml);
CComPtr pRefNode;
mpData[_T("width")] = _T("10%");
mpData[_T("class")] = _T("td_num");
xny::String strXML = _T("")
_T("")
_T("")
_T("")
_T("")
_T(" ");
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml, strXML.c_str());
strRetXml += strRetHtml;
mpData.clear();
mpData[_T("width")] = _T("10%");
mpData[_T("class")] = _T("borderT3");
mpData[_T("data")] = info.strType;
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml);
strRetXml += strRetHtml;
mpData.clear();
mpData[_T("width")] = _T("15%");
mpData[_T("class")] = _T("borderT3");
mpData[_T("data")] = info.strTableNum;
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml);
strRetXml += strRetHtml;
mpData.clear();
mpData[_T("width")] = _T("15%");
mpData[_T("class")] = _T("borderT3");
mpData[_T("data")] = info.strTableNum;
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml);
strRetXml += strRetHtml;
mpData.clear();
mpData[_T("width")] = _T("20%");
mpData[_T("class")] = _T("borderT3");
mpData[_T("data")] = info.strTableName;
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml);
mpData.clear();
mpData[_T("width")] = _T("10%");
mpData[_T("class")] = _T("borderT3");
strXML = _T(" ");
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml, strXML.c_str());
strRetXml += strXML;
mpData.clear();
mpData[_T("width")] = _T("20%");
mpData[_T("class")] = _T("borderT3");
strXML = _T(" ");
CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml, strXML.c_str());
strRetXml += strXML;
hRet = pParent->appendChild(pNode_Main, &pRefNode);
} while (0);
return hRet;
}
CComPtr CreateHtmlNode(CComPtr pHtmlDoc2, xny::String strTag, std::map& mpAttr, IHTMLDOMNode* pParent, LPCTSTR lpXML )
{
CComPtr ele = NULL;
BSTR strText = ::SysAllocString(strTag.c_str());
pHtmlDoc2->createElement(strText, (IHTMLElement**)&ele);
CComPtr node = NULL;
ele->QueryInterface(IID_IHTMLDOMNode, (void **)&node);//you need include
SysFreeString(strText);
VARIANT attrVal;
if (lpXML)
{
strText = SysAllocString(lpXML);
ele->put_innerHTML(strText);
SysFreeString(strText);
}
for (auto it_attr = mpAttr.begin(); it_attr != mpAttr.end(); it_attr++)
{
if (it_attr->first == _T("data"))
{
BSTR text = ::SysAllocString(it_attr->second.c_str());
ele->put_innerText(text);
SysFreeString(text);
continue;
}
attrVal.vt = VT_BSTR;
attrVal.bstrVal = ::SysAllocString(it_attr->second.c_str());
BSTR strName = ::SysAllocString(it_attr->first.c_str());
ele->setAttribute(strName, attrVal);
SysFreeString(strName);
SysFreeString(attrVal.bstrVal);
VariantClear(&attrVal);
}
if (pParent)
{
CComPtr pRetNode;
pParent->appendChild(node, &pRetNode);
}
return node;
}
(6) 调用Js函数
xny::Integer CallJsFun(LPCTSTR lpFunName, LPCTSTR lpParam )
{
xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
do
{
if (m_pWebBrowserEx == NULL ) break;
VARIANT params[10];
int nParamNum = 0;
if (lpParam != NULL)
{
xny::StringArray arr = util::CStrMisc::split_vct(lpParam, _T(","));
int nIndex = 0;
for (auto it_param = arr.begin(); it_param != arr.end(); it_param++, nIndex++)
{
params[nIndex].vt = VT_BSTR;
params[nIndex].bstrVal = ::SysAllocString(lpParam);
}
nParamNum = arr.size();
}
CComBSTR bStr = lpFunName;
VARIANT ret;
CWebBrowserEx::InvokeMethod(m_pWebBrowserEx->GetHtmlWindow(), bStr, &ret, params, nParamNum);
if (nParamNum)
{
for (int i = 0; i < nParamNum; i++)
{
SysFreeString(params[i].bstrVal);
VariantClear(¶ms[i]);
}
}
nRet = nsny::eProbeErr::NYERR_SUCCESS;
} while (0);
return nRet;
}
(7) 网页按钮模拟点击
xny::Integer ClickButton(LPCTSTR lpBtnName, LPCTSTR lpClassName, LPCTSTR lpBtnTag, LPCTSTR lpParentName, LPCTSTR lpPopFrameName)
{
xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
do
{
if (m_pWebBrowserEx == NULL ) break;
CComPtr pElement = NULL;
if (lpPopFrameName)
{
CComPtr pIFrame = (IHTMLIFrameElement*)m_pWebBrowserEx->GetElementByName(lpPopFrameName,lpParentName, IID_IHTMLIFrameElement);
if (pIFrame == NULL) break;
if (lpClassName)
pElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByTag(lpClassName, lpBtnTag, lpBtnName, pIFrame, IID_IHTMLElement);
else
pElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByName(lpBtnName, pIFrame, IID_IHTMLElement);
}
else
{
if (lpClassName)
pElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByTag(lpClassName, lpBtnTag, lpBtnName, lpParentName, IID_IHTMLElement);
else
pElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByName(lpBtnName, lpParentName, IID_IHTMLElement);
}
if (pElement == NULL ) break;
VARIANT params[10];
VARIANT ret;
CWebBrowserEx::InvokeMethod(pElement, _T("click"), &ret, params, 0);
nRet = nsny::eProbeErr::NYERR_SUCCESS;
} while (0);
return nRet;
(8) 模拟上传文件(由于篇幅问题,需要的可以移步到下一篇文章中查看)