【发布时间】:2009-07-28 04:09:27
【问题描述】:
我正在使用 WatiN 库在部署后对网站进行快速冒烟测试。除其他外,我想确保当我单击页面上的特定链接时,会在浏览器中打开 PDF。单击链接很容易,但是如何检测 Acrobat Reader 是否在浏览器窗口中成功打开?我想捕捉 404、服务器错误或超时等情况...
【问题讨论】:
我正在使用 WatiN 库在部署后对网站进行快速冒烟测试。除其他外,我想确保当我单击页面上的特定链接时,会在浏览器中打开 PDF。单击链接很容易,但是如何检测 Acrobat Reader 是否在浏览器窗口中成功打开?我想捕捉 404、服务器错误或超时等情况...
【问题讨论】:
擦,
我发现了一份关于此问题的错误报告和一项功能请求。错误和功能请求都已关闭,但我仍然无法附加到托管 PDF 文档的 IE 窗口。
事实上,托管 PDF 文件的窗口甚至不是 IE.InternetExplorers() 或 InternetExplorersNoWait() 集合中的项目。
我在 Windows XP 上使用 WatiN 2.0.10.928 和 IE7。
我的解决方案是使用添加对 Interop.ShDocVw.dll 的 COM 引用并自己检查窗口,因为托管 PDF 查看器的 IE 窗口不是 WatiN.IE.InternetExplorers() 中的项目出于某种原因收集。
不要使用添加引用 -> COM -> Microsoft Internet Controls v1.1 添加对 Interop.ShDocVw.dll 的引用。如果您这样做,您很有可能会收到此异常:
System.IO.FileLoadException: 无法加载文件或程序集 'Interop.SHDocVw, Version=1.1.0.0, Culture=neutral ... 或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配(HRESULT 异常:0x80131040)
相反,您需要引用随 WatiN 分发的 ShDocVw.dll。查看“WatiN 错误无法加载程序集”StackOverflow 问题以获取更多信息: WatiN Error Could not Load Assembly
using System.IO;
using SHDocVw;
namespace PDF_SPIKE
{
class Program
[STAThread]
static void Main(string[] args)
{
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
string pdfViewerURL = "http://YourURL/document.pdf";
bool pdfOpened = false;
string filename;
foreach ( SHDocVw.InternetExplorer ie in shellWindows )
{
filename = Path.GetFileNameWithoutExtension( ie.FullName ).ToLower();
if ( filename.Equals("iexplore") && ie.LocationURL.Equals(pdfViewerURL))
pdfOpened = true;
}
if ( pdfOpened )
Console.WriteLine( "Your PDF file is OPENED" );
else
Console.WriteLine( "Your PDF file was NOT found." );
}
【讨论】:
感谢 MoMo 的回答。这对我也很有帮助。
我只想为这个答案提供一个额外的解决方案,以防万一其他人遇到与我相同的问题。
我最初收到执行此行的错误:
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindowsClass();
"SHDocVw.ShellWindowsClass 不能嵌入,请改用适用的接口"
可以在这里找到解决方案: http://www.debugging.com/bug/24258
您需要右键单击引用 Interop.ShDocVW.dll 并将嵌入互操作类型设置为 false。
【讨论】: