测试一下在IE浏览器界面中插入代码测试,采用寻找窗口的方式获取Internet Explorer_Server句柄。

  写的时候参考了很多网上的资料,有些地方不大适用就稍微修改了一下。

  1. SendMessageTimeout函数一直无效(看网上有一回答说c#可以正常使用,没试过),无效情况是执行成功(非超时),但是lpRes为0,于是改用SendMessage;
  2. 使用spyxx查找IEFrame下的Internet Explorer_Server窗口,根据实际情况来寻找窗口,网上年代久远的部分代码只有三层;
  3. 似乎是因为main函数在退出时会释放程序执行过程中申请的所有资源的原因,在程序最后加上CoUninitialize()将导致win7下出现程序退出异常的情况,在win10下则不会;另一个解决办法是在CoUninitialize()后边使用ExitProcess()退出进程,但是可能有部分内存未释放;
  4. 测试代码时,在win7及以下平台系统中navigate2()方法无法使用,应使用navigate(),使用navigate()时BSTR类型的URL参数时使用SysAllocString初始化,虽然实际上是wchar*,但是使用常量初始化变量或者使用字符串拷贝函数wcscpy时会出错(迷);
  5. QueryService参数中的SID_SWebBrowserApp替换为IID_IWebBrowserApp

  这里将js代码写入页面需要运行的话,我是使用IHTMLDocument2write方法写回document,页面刷新执行js代码,但是页面部分样式可能丢失。除此之外,还有很多方法可以实现,比如利用事件响应等方法,而且也不一定插入js,插入iframe或者一条链接之类的无需刷新页面。

#include "windows.h"
#include "mshtml.h"
#include "stdio.h"
#include "ExDisp.h"
#include "atlbase.h"
#include "comutil.h"
#include "oleacc.h" //#pragma comment(lib, "oleacc.lib") //int WINAPI WinMain(HINSTANCE hins, HINSTANCE hPrev, LPSTR lpCmdLine, INT nCmdShow) {
INT main(int argc, char* argv[]){
//IWebBrowser2
HWND hWnd_pre = NULL, hWnd_child = NULL, hWnd_IES = NULL;
hWnd_pre = FindWindow("IEFrame", NULL); //IE Window Class
if (hWnd_pre == NULL) {
OutputDebugString(TEXT("IE didnot open."));
} hWnd_child = FindWindowEx(hWnd_pre, 0, TEXT("Shell DocObject View"), NULL); // test
if (hWnd_child == NULL) { // not only three Layers
hWnd_child = FindWindowEx(hWnd_pre, 0, TEXT("Frame Tab"), NULL);
if (hWnd_child == NULL) {
OutputDebugString(TEXT("not Found IE Tab."));
}
hWnd_pre = hWnd_child;
hWnd_child = FindWindowEx(hWnd_pre, 0, TEXT("TabWindowClass"), NULL);
hWnd_pre = hWnd_child;
hWnd_child = FindWindowEx(hWnd_pre, 0, TEXT("Shell DocObject View"), NULL);
hWnd_pre = hWnd_child;
hWnd_child = FindWindowEx(hWnd_pre, 0, TEXT("Internet Explorer_Server"), NULL);
}
else {
hWnd_pre = hWnd_child;
hWnd_child = FindWindowEx(hWnd_pre, 0, TEXT("Internet Explorer_Server"), NULL);
}
hWnd_IES = hWnd_child; // Get Internet Explorer_Server Window's Handle
printf("handle value of Internet Explorer_Server => %#x\n", (DWORD*)hWnd_child); CoInitialize(0); // for using of COM interfaces
UINT nMsg = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT")); // register common msg of between two windows
if (nMsg)
printf("success registe Window message WM_HTML_GETOBJECT, msg ID => %#x\n", nMsg); CComPtr<IHTMLDocument2> pHtmlDoc;
LRESULT result;
//if (!SendMessageTimeout(hWnd_IES, nMsg, 0, 0, SMTO_NORMAL, 30000, (LPDWORD)result)) {
if (!(result = SendMessage(hWnd_IES, nMsg, 0, 0))) // send message for associated value of msg
printf("call sendMessageTimeout failed:( error code: %#x\n", GetLastError());
else {
printf("returned result value: %#x\n", result);
/*if (!result) {
printf("returned result id none...end");
ExitProcess(1);
}*/
HMODULE hLib = LoadLibrary("oleacc.dll");
LPFNOBJECTFROMLRESULT pFObjectFromLresult = (LPFNOBJECTFROMLRESULT)GetProcAddress(hLib, "ObjectFromLresult");
//HRESULT hRes = ObjectFromLresult(result, IID_IHTMLDocument2, 0, (void**)&pHtmlDoc);
HRESULT hRes = pFObjectFromLresult(result, IID_IHTMLDocument2, 0, (void**)&pHtmlDoc);
if (SUCCEEDED(hRes)) {
printf("get IHTMLDocument2 success :)\n");
//OLECHAR urll[] = L"http://www.baidu.com/";
CComPtr<IHTMLWindow2> spWnd2;
CComPtr<IServiceProvider> spServiceProvider;
IWebBrowser2* pWebBrow = NULL;
hRes = pHtmlDoc->get_parentWindow((IHTMLWindow2**)&spWnd2);
if (SUCCEEDED(hRes)) {
hRes = spWnd2->QueryInterface(IID_IServiceProvider, (void**)&spServiceProvider); // Query Interface
if (SUCCEEDED(hRes)) {
hRes = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&pWebBrow); // query service
if (SUCCEEDED(hRes)) {
printf("Get IWebBrowser handlw Success :)\n"); ////1-跳转测试
//VARIANT PARAM;
//VariantInit(&PARAM);
////V_VT(&PARAM) = VT_I4;
////V_I4(&PARAM) = navOpenInNewTab; //open in new tab
////hRes = pWebBrow->Navigate2(&CComVariant("http://www.baidu.com/"), 0, 0, 0, 0);// win7 and former versions not support.
//BSTR URLL = SysAllocString(L"http://www.baidu.com/");
//hRes = pWebBrow->Navigate(URLL, &PARAM, &PARAM, &PARAM, &PARAM); // navigate
//SysFreeString(URLL);
//if (SUCCEEDED(hRes)) printf("navigate success :)\n");
//else printf("navigate failed :(\n"); ///*//2-获取地址栏URL测试
//hRes = pWebBrow->get_LocationURL(&URLLL);
//if(SUCCEEDED(hRes))
// printf("Get URL : %ws\n", URLL);*/ ////3-write document
//SAFEARRAY* pSafeArr = SafeArrayCreateVector(VT_VARIANT, 0, 1);
//if (pSafeArr) {
// BSTR pInsertCode = SysAllocString(L"<script>alert('just a test')</script>");
// VARIANT *PARAM = NULL;
// SafeArrayAccessData(pSafeArr, (void**)&PARAM);
// V_VT(PARAM) = VT_BSTR; // PARAM->vt = VT_BSTR
// V_BSTR(PARAM) = pInsertCode; // PARAM->bStrVal
// SafeArrayUnaccessData(pSafeArr);
// pHtmlDoc->write(pSafeArr); // will refresh
// pHtmlDoc->close();
// SafeArrayDestroy(pSafeArr);
// pSafeArr = NULL;
//} //get HTML codes
BSTR pText = SysAllocString(L"<script>alert('test')</script>");
BSTR wheer = SysAllocString(L"afterBegin"); //代码放置位置
CComPtr<IHTMLElement> pHtmlElem;
pHtmlDoc->get_body(&pHtmlElem); //pHtmlElem->get_innerHTML(&pText);
//pHtmlElem->put_innerHTML(pText);
hRes = pHtmlElem->insertAdjacentHTML(wheer, pText); // 插入
SysFreeString(pText);
SysFreeString(wheer);
pText = NULL;
wheer = NULL; //重载页面
if (SUCCEEDED(hRes)) {
printf("insert html code SUCCESS:)\n"); /*pHtmlElem->get_outerHTML(&pText);
SAFEARRAY* pSafeArr = SafeArrayCreateVector(VT_VARIANT, 0, 1);
VARIANT *PARAM = NULL;
SafeArrayAccessData(pSafeArr, (void**)&PARAM);
V_VT(PARAM) = VT_BSTR;
V_BSTR(PARAM) = pText;
SafeArrayUnaccessData(pSafeArr);
pHtmlDoc->write(pSafeArr);
pHtmlDoc->close();
SafeArrayDestroy(pSafeArr);
pSafeArr = NULL;*/
}
else
printf("insert html code Failed:(\n");
//printf("HTML Text (length: %#x): %ws\n", );
//INT dwSize = wcslen(pText);
//CHAR *pOutter = (CHAR*)malloc(dwSize);
//WideCharToMultiByte(CP_ACP, 0, pText, dwSize, pOutter, dwSize, 0, 0);
//FILE *fp = fopen("html.html", "w");
////fprintf(fp, "%ws", pText);
//fwrite(pOutter, wcslen(pText), 1, fp);
//free(pOutter);
//fclose(fp); }
else printf("Get IWebBrowser handle Failed:(\n");
}
//pHtmlDoc->get_body(&pHtmlElem); //get_body(&pHtmlElem);
//pHtmlElem->get_outerHTML(pText); //get_innerText(pText);
//printf("GOT > \n%ws\n", pText);
pWebBrow->Release();
pWebBrow = NULL;
}
else
printf("error returned Result Code: %#x\n", hRes);
}
else printf("get IHTMLDocument2 failed:(\n");
}
/*printf("%#x\n", hwd); PostMessage(hWnd_IES, WM_QUIT, 0, 0);
PostMessage(hWnd_IES, WM_CLOSE, 0, 0);
PostMessage(hWnd_IES, WM_DESTROY, 0, 0);*/
/*CoUninitialize(); //添加则出现异常,可能是在程序退出时还会调用一次析构函数,以释放所有声明的变量
ExitProcess(0);*/
}

  愈发感觉windows的不简单。

参考链接:

  1. MSDN
  2. 获取IWebBrowser2指针的方法

使用IWebBrowser2操控浏览器页面测试(IE)的更多相关文章

  1. Web前端页面的浏览器兼容性测试心得(二)搭建原汁原味的IE8测试环境

    如果你做的页面被老板或PM要求兼容IE8,你就值得同情了.IE8不支持HTML5,在2017年的前端界,开发者不涉及HTML5标准简直寸步难行.然而,有一个可怕的事实客观存在,那就是IE8是Win7系 ...

  2. Selenium基础之--01(将浏览器最大化,设置浏览器固定宽、高,操控浏览器前进、后退)

    1,将浏览器最大化 我们知道调用启动的浏览器不是全屏的,这样不会影响脚本的执行,但是有时候会影响我们"观看"脚本的执行. coding=utf-8 from selenium im ...

  3. BrowserSync - 浏览器同步测试工具

    背景: 之前在学gulp的时候,使用gulp-livereload来实时自动刷新页面省时开发,但一直比较难用,现在找到新的替代神器. 安装:   // 使用淘宝镜像会快些 npm install -g ...

  4. 省时的浏览器同步测试工具 browsersync NodeJS

    http://www.browsersync.cn/ 省时的浏览器同步测试工具 Browsersync能让浏览器实时.快速响应您的文件更改(html.js.css.sass.less等)并自动刷新页面 ...

  5. Web浏览器兼容性测试工具如何选择

    对于前端开发工程师来说,网页兼容性测试工程师而言,确保代码在各种主流浏览器的各个版本中都能正常工作是件很费时的事情,幸运的是,有很多优秀的工具可以帮助测试浏览器的兼容性,领测软件测试网向您推荐12款很 ...

  6. 在线HTTP速度测试(响应时间测试)及浏览器兼容测试

    一.前言 网站的响应时间,是判断一个网站是否是好网站的重要的因素之一.百度首页的响应时间在全国各个省份小于10ms.这个响应时间远远好于竞争对手.根据美丽说的技术负责人分析,美丽说访问速度提升10%, ...

  7. mac安装浏览器同步测试工具

    1.安装node.js (1)打开终端,输入以下命令安装Homebrew ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebre ...

  8. Selenium_python自动化跨浏览器执行测试

    Selenium_python自动化跨浏览器执行测试(简单多线程案例)  转:https://www.cnblogs.com/dong-c/p/8976746.html 跨浏览器测试是功能测试的一个分 ...

  9. 浏览器页面区域大小的js获取方法

    浏览器页面区域大小的获取:  /在IE.FireFox.Opera下都可以使用  document.body.clientWidth  document.body.clientHeight  //即可 ...

随机推荐

  1. centos7 单用户模式修改root密码

    1. 在虚拟机重启客户机后.会出现下面进入界面.按e键 2.按了e键后,会出现下面的界面.此时按↓键.找到linux16 3.将光标移动到UTF-8后面,添加init=/bin/sh,并按 ctrl  ...

  2. ​第3届云原生技术实践峰会(CNBPS 2020)重磅开启,“原”力蓄势待发!

    CNBPS 2020将在11月19-21日全新启动!作为国内最有影响力的云原生盛会之一,云原生技术实践峰会(CNBPS)至今已举办三届. 在2019年的CNBPS上,灵雀云CTO陈恺喊出"云 ...

  3. Windows 10 安装 Git 与初次运行前的配置

    Windows 10 安装 Git 与初次运行前的配置 在 Windows 上安装 初次运行 Git 前的配置 用户信息 文本编辑器 检查配置信息 获取 Git 仓库 在现有目录中初始化仓库 克隆现有 ...

  4. 手动安装selenium包

    1.下载selenium安装包 https://pypi.org/project/selenium 2.解压selenium-3.12.0.tar.gz 3.cmd环境进入到selenium的setu ...

  5. python+selenium 定位元素的主要方法

    selenium对web各元素的操作首先就要先定位元素,定位元素的方法主要有以下几种: 通过id定位元素:find_element_by_id("id_vaule") 通过name ...

  6. 【Warrior刷题笔记】143.重排链表 【线性化 || 双指针+翻转链表+链表合并】详细注释

    题目一 力扣143.重排链表 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list/ 1.描述 给定一个单链表L的头节点he ...

  7. Vue框架怎么使用mediainfo.js来检测视频文件是否有音轨?

    啥是MediaInfo? 简而言之,MediaInfo是一个能读取音频和视频文件并分析和输出音视频信息的工具,能输出的内容包括视频信息,音轨,字幕等. MediaInfo也可以在web端使用,需要使用 ...

  8. Elasticsearch使用系列-ES增删查改基本操作+ik分词

    Elasticsearch使用系列-ES简介和环境搭建 Elasticsearch使用系列-ES增删查改基本操作+ik分词 一.安装可视化工具Kibana ES是一个NoSql数据库应用.和其他数据库 ...

  9. WEB前端基础之SCC(字体颜色背景-盒子模型)

    目录 一:伪元素选择器 1.首字调整>>>:也是一种文档布局的方式 2.在文本的前面通过css动态渲染文本>>>:特殊文本无法选中 3.在文本的后面通过css动态渲 ...

  10. Linux inode节点使用率过大处理办法

    当发现某个分区下的inode使用率过大时,需要找到该分区下的某些目录里有哪些文件可以清理. 查找某个目录下一个月或两个月之前的文件,然后删除# find . -type f -mtime +30 |w ...