1

我在不同版本的 Windows Explorer 上使用 Selenium WebDriver 2.25 测试我们的应用程序,这意味着在不同的机器上运行测试。

虽然使用 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

4 回答 4

2

IEDriverServer.exe 被构建为一个小的、简单的可执行文件,它具有一个 .dll,其中 IE 驱动程序的真实代码作为资源嵌入在 .exe 中。要使用这个 .dll,可执行文件必须在某处提取 .dll,以便它可以调用 Windows LoadLibraryAPI 来加载并随后执行 .dll 的代码。默认情况下,提取是在临时目录中完成的。如果不生成日志文件来调查问题,我们可以推测 .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类连接到它。这意味着您对可执行进程的生命周期负责,但这可能是您获得所需行为的一种方式。

于 2013-07-19T20:40:10.210 回答
0

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

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

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

于 2013-07-29T15:05:55.187 回答
0

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

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

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

这应该可以解决问题。

于 2015-02-26T14:06:02.283 回答
-1

按照答案2,这是执行此操作的确切方法:

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

driver = new InternetExplorerDriver(service);
于 2017-08-07T20:42:31.657 回答