【发布时间】:2015-04-09 15:30:03
【问题描述】:
使用 Selenium 和 PhantomJS,我可以从运行在 localhost 上的服务器加载文件,如下所示:
_driver.Url = "http://localhost:52873/Home/Template";
其中_driver 是RemoteWebDriver 的一个实例,它连接到在端口上运行的PhantomJS 实例(使用--webdriver=9134 启动)。我可以像这样调用该 HTML 文件中定义的 Javascript 函数:
var val = _driver.ExecuteScript("myFunction()");
但是,我想从本地文件系统而不是通过本地网络服务器加载它,所以我尝试了这样的操作:
_driver.Url = "file://c:/path/to/Home/template.html";
我没有收到任何错误,但是当我尝试执行html 文件中定义的脚本时,它不起作用。它会抛出一个InvalidOperationException 和消息Can't find variable: myFunction。但是,如果我将 _driver 设置为 ChromeDriver 的实例,我可以看到页面加载并且一切都按预期工作,两者都使用 http 和 file 协议。
我没有从 PhantomJS 控制台窗口中获得任何其他信息,所以我真的不知道问题出在哪里。我怀疑出于某种原因 PhantomJS 只是没有加载页面。有什么想法吗?
另外,有什么方法可以使用 selenium 的 .NET 绑定来访问控制台日志?我在我的 html 文件中添加了一个 console.log("connected"),以便在页面加载后立即运行,但是当从 file 或 http 运行时,它不会回显到 phantomJS 控制台,所以这没什么帮助。
【问题讨论】:
-
html 是否包含对远程资源的引用?如果是,您可能需要在运行 PhantomJS 服务器时设置
--local-to-remote-url-access=true。 -
@ArtjomB.:它包括其他文件的相对路径,这些文件也是本地文件。像
<script src="../../Scripts/jquery.min.js"></script>这样的东西。我只是偶然尝试了--local-to-remote-url-access,但似乎没有帮助。 -
作为调试步骤,我会尝试使用ProcessMonitor 来确定 PhantomJS 访问这些文件是否存在权限问题。
-
Arrrgh:没关系,问题是我需要
file:///而不是file://。 Chrome 自动插入了额外的/,而 Phantom 没有。我注意到我在 Chrome 上运行它时比较了地址栏中的实际 URL,并注意到了差异。