调用IEDriverServer时出现“无法加载库”错误

时间:2013-07-18 21:33:48

标签: selenium-webdriver

我正在使用Selenium WebDriver 2.25在不同版本的Windows资源管理器上测试我们的应用程序,这意味着在不同的计算机上运行测试。

虽然使用IE 8测试应用程序工作正常,但在尝试使用IE7在工作站上运行测试时出现了一个奇怪的错误。它正在运行装有Java 6的Windows XP Service Pack 2.当我尝试运行IEDriverServer_Win32可执行文件时,出现以下错误:

Failed to load the library from temp directory: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp

我错过了什么?

4 个答案:

答案 0 :(得分:2)

IEDriverServer.exe被设计为一个简单的小型可执行文件,其中包含.dll,其中嵌入了作为.exe内资源的IE驱动程序的实际代码。要使用此.dll,可执行文件必须在某处提取.dll,以便它可以调用Windows LoadLibrary API来加载并随后执行.dll的代码。默认情况下,该提取将在temp目录中完成。在没有生成日志文件来查看问题的情况下,我们可以推测.dll未被正确解压缩,或者一旦被解压缩,对LoadLibrary的调用失败。

幸运的是,IE驱动程序为此问题提供了一种解决方法。如果将--extract-path="path\to\extract\dll\to"作为命令行参数传递给IEDriverServer.exe,则可以明确指定要用于提取的目录。请参阅语言绑定的文档,了解如何以编程方式传递此命令行参数。

例如,为Java工作,代码如下所示:

// WARNING: Entirely untested code below! Was written from memory without
// the benefit of an IDE. May not work correctly or even compile without
// modification.
// Assume "location" is a properly instantiated java.io.File containing
// the location of IEDriverServer.exe.
InternetExplorerDriverService service = new InternetExplorerDriverService.Builder()
    .withExtractPath(location)
    .build();
WebDriver driver = new InternetExplorerDriver(service);

另一种替代方法可能是手动启动IEDriverServer.exe,并使用您的语言绑定“RemoteWebDriver类连接到它。这意味着您要对可执行流程的生命周期负责,但这可能是您获取所需行为的一种方式。

答案 1 :(得分:0)

我实际上有一个类似的问题,它无法提取到临时目录,我做的是我进入IEDriver提取DLL的文件夹,并删除了与Selenium相关的文件夹中的所有内容。

所以对我来说它是C:\ Users \ usnm \ AppData \ Local \ Temp,并且有很多文件,比如webdriver_blahblah120398405.tmp,以及很多类似命名的文件夹。当我全部删除它们时,我的程序又开始工作了。所以对你来说它是C:\ DOCUME~1 \ ADMINI~1 \ LOCALS~1 \ Temp

当然我们的错误略有不同(我正在使用Selenium 2.33)。我的错误是“无法提取”,而不是“无法加载”

答案 2 :(得分:0)

在某些系统中,防病毒或其他保护软件会阻止运行exe文件,或者在这种情况下从临时文件夹加载dll库。

启动selenium节点时添加一个额外的参数并指定当前dir的提取路径(确保当前dir可由用户写入并且不需要提升权限)。例如,如果您的IEDriverServer.exe位于C:\ node,那么

java -jar selenium-server-standalone.jar -role node ..... -Dwebdriver.ie.driver.extractpath=C:\node

这应该可以解决问题。

答案 3 :(得分:-1)

在答案2之后,这是确切的方法:

File extractPath=new File("c://your//file//todllextracts");
InternetExplorerDriverService service = new InternetExplorerDriverService.Builder().withExtractPath(extractPath).build();

driver = new InternetExplorerDriver(service);