接上一篇文章内容,本篇文章将讲解如何使用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<IHTMLElement> pElement = NULL;if (lpPopFrameName){CComPtr<IHTMLIFrameElement> 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<IHTMLElement> 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<IHTMLSelectElement> 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<IHTMLOptionElement> 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<IHTMLTable> pElement = NULL;pElement = (IHTMLTable*)m_pWebBrowserEx->GetElementByName(lpTabName, lpParentName, IID_IHTMLTable);if (pElement == NULL ) break;//清理CComPtr<IHTMLElementCollection> pBody;HRESULT hr = pElement->get_tBodies(&pBody);if (FAILED(hr)) break;long lNum = 0;pBody->get_length(&lNum);CComPtr<IHTMLDOMNode> 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<IHTMLElement> 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<IHTMLDocument2> pHtmlDoc2 = NULL;CComPtr<IDispatch> 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<IHTMLDocument2> pHtmlDoc2, IHTMLDOMNode* pParent, TABLE_INFO& info, int nCurIndex){HRESULT hRet = S_FALSE;std::map<xny::String, xny::String> mpAttr;xny::String strRetXml;do{if (pHtmlDoc2 == NULL ) break;if (pParent == NULL ) break;std::map<xny::String, xny::String> mpData;xny::String strRetHtml;CComPtr<IHTMLDOMNode> pNode_Main = CreateHtmlNode(pHtmlDoc2, _T("tr"), mpData, NULL, strRetHtml);CComPtr<IHTMLDOMNode> pRefNode;mpData[_T("width")] = _T("10%");mpData[_T("class")] = _T("td_num");xny::String strXML = _T("<td width=\"10%\" class=\"td_num\">")_T("<input name=\"element_name1\" id=\"tn_")+ std::to_wstring(nCurIndex)+_T("\"")_T("style=\"border: 0px currentColor; width: 60px; text-align: center;\" type=\"text\"")_T("readOnly=\"true\" value=\"") + std::to_wstring(nCurIndex) + _T("\">")_T("<input name=\"element_name2\" style=\"display: none;\" type=\"checkbox\"")_T("CHECKED=\"checked\" value=\"") + info.strTableID + _T("\">")_T("<input name=\"element_name3\"")_T("style=\"display: none;\" type=\"checkbox\" CHECKED=\"checked\" value=\"") + info.strTableName + _T("\">")_T("<input name=\"element_name4\" style=\"display: none;\" type=\"checkbox\" CHECKED=\"checked\" value=\"") + info.strType + _T("\">")_T("</td>");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("<td width=\"10%\" class=\"borderT3\"><input onclick=\"attremove(this)\" type=\"button\" value=\"删除\"></td>");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("<td width = \"20%\" class=\"borderT3\"><input name=\"btn1\"")_T("onclick = \"prevMoveTrCommand(this,'tableTest','tb_num');\" type=\"button\" value=\"上移\"><input ")_T("name = \"btn2\" onclick=\"nextMoveTrCommand(this,'tableTest','tb_num');\" type=\"button\"")_T("value = \"下移\"></td>");CreateHtmlNode(pHtmlDoc2, _T("td"), mpData, pNode_Main, strRetHtml, strXML.c_str());strRetXml += strXML;hRet = pParent->appendChild(pNode_Main, &pRefNode);} while (0);return hRet;}
CComPtr<IHTMLDOMNode> CreateHtmlNode(CComPtr<IHTMLDocument2> pHtmlDoc2, xny::String strTag, std::map<xny::String, xny::String>& mpAttr, IHTMLDOMNode* pParent, LPCTSTR lpXML ){CComPtr<IHTMLElement> ele = NULL;BSTR strText = ::SysAllocString(strTag.c_str());pHtmlDoc2->createElement(strText, (IHTMLElement**)&ele);CComPtr<IHTMLDOMNode> node = NULL;ele->QueryInterface(IID_IHTMLDOMNode, (void **)&node);//you need include <mshtml.h>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<IHTMLDOMNode> 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(&params[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<IHTMLElement> pElement = NULL;if (lpPopFrameName){CComPtr<IHTMLIFrameElement> 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);elsepElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByName(lpBtnName, pIFrame, IID_IHTMLElement);}else{if (lpClassName)pElement = (IHTMLElement*)m_pWebBrowserEx->GetElementByTag(lpClassName, lpBtnTag, lpBtnName, lpParentName, IID_IHTMLElement);elsepElement = (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)  模拟上传文件(由于篇幅问题,需要的可以移步到下一篇文章中查看)

VC Webbrowser操作全解(二)相关推荐

  1. JavaScript对TreeView的操作全解

    JavaScript对TreeView的操作全解 JavaScript对TreeView的操作全解 <script language="C#" runat="ser ...

  2. 安卓网络操作全解:发起请求,解析响应

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓网络操作全解. 发起请求,解析xml响应流 //发起一个请求 private void connect(String urlpath) {//启动 ...

  3. 安卓文件操作全解:内部文件、公共文件、私有文件、app静态文件

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓文件操作全解:内部文件.公共文件.私有文件.app静态文件. 读内部文件(当前应用程序文件夹下文件) public static String o ...

  4. js系列教程7-DOM操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  5. js系列教程6-BOM操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  6. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  7. jquery系列教程2-style样式操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...

  8. jquery系列教程5-动画操作全解

    点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...

  9. jquery系列教程4-事件操作全解

    点击打开: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件操作全解 jquery系列教程5-动 ...

  10. jquery系列教程3-DOM操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: jquery系列教程1-选择器全解 jquery系列教程2-style样式操作全解 jquery系列教程3-DOM操作全解 jquery系列教程4-事件 ...

最新文章

  1. Java_apply_in_automatic_system
  2. Linux下载交通图片数据集CityScapes Dataset
  3. PHP预定义常量DIRECTORY_SEPARATOR
  4. Linux多线程之线程同步(条件变量)
  5. oracle授权、表备份、用户管理
  6. Linux Apache 怎么修改工作模式
  7. Dapper介绍--Micro-ORM
  8. 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。...
  9. 数据结构笔记(十二)-- 定长顺序结构的实现
  10. 天极游戏2005年度回顾:电视游戏篇
  11. 合同管理系统操作手册
  12. 一年半JAVA工作经验的总结
  13. Android音视频之不同设备之间的视频通话(webSocket)
  14. 谷歌浏览器 如何设置在新标签页打开链接
  15. 大数据的概念、特点及应用场景
  16. 能解决 80% 需求的 10个 CSS动画库
  17. TIA博途中变长数组的介绍与使用入门示例
  18. STM32之内存分布与总线
  19. 微信小程序商城购物车页 二维数组怎么做
  20. [Python3] 线程池的使用

热门文章

  1. 举个栗子!Tableau 技巧(97):离线安装 Linux 版 Tableau Server
  2. STM32电机库5.4开源注释单电阻霍尔 有感霍尔读取电角度 单电阻采样
  3. PUBG雷蛇鼠标宏,简单易学,有手就行。
  4. sqlserver 2016 安装
  5. android java项目源码_Android项目源码本站第三个知乎app项目
  6. 用python调用r包
  7. C语言实现九九乘法表,以for循环为主
  8. 算法设计与分析——排序算法:十大排序算法总结
  9. 软件可行性研究报告模板
  10. UNIX环境高级编程习题——第一章