Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕获Selenium WebDriver中的JavaScript错误–;浏览器独立_Java_Selenium Webdriver - Fatal编程技术网

捕获Selenium WebDriver中的JavaScript错误–;浏览器独立

捕获Selenium WebDriver中的JavaScript错误–;浏览器独立,java,selenium-webdriver,Java,Selenium Webdriver,我想知道是否有人可以扩展这些尝试,或者有任何其他想法来使用WebDriver捕获JS错误,这些WebDriver将在Firefox、Chrome、Internet Explorer和Safari中工作 以下是迄今为止的尝试: 尝试–问题: JSErrorCollector.jar-工作正常,但只是Firefox的解决方案 将JS注入到页面源代码中–我使用WebDriver将window.onerror代码注入到页面的源代码中,但是由于注入太晚,因此没有出现任何初始错误 BrowserMob–我可

我想知道是否有人可以扩展这些尝试,或者有任何其他想法来使用WebDriver捕获JS错误,这些WebDriver将在Firefox、Chrome、Internet Explorer和Safari中工作

以下是迄今为止的尝试:
尝试–问题:

JSErrorCollector.jar-工作正常,但只是Firefox的解决方案

将JS注入到页面源代码中–我使用WebDriver将
window.onerror
代码注入到页面的源代码中,但是由于注入太晚,因此没有出现任何初始错误

BrowserMob–我可以截获HTTP响应,并计划将
窗口.onerror
代码注入响应体,但作者尚未实现
getBody()
方法,因此我知道只能修改头。对于所有响应,主体始终为空。(我在一个网页上,作者谈到了实现
getBody()
,但还没有实现,我再也找不到了)

Fiddler–JS将正确注入,但Fiddler是Windows,因此Safari无法工作

父/子窗口–我使用javascript打开并存储对测试页面窗口的引用。
window.onerror code
包含在父窗口中,因此不会错过子窗口中的启动错误。我只能在Firefox和Chome中使用它。我已经问了一个问题

Selenium RC–我没有尝试过它,因为我所有的测试都使用WebDriver,但我知道它有一些方法,比如
captureNetworkTraffic()
,但我认为它不能在WebDriver中使用

IE错误弹出窗口–我打算使用Firefox/Chrome的父/子解决方案,然后查找IE错误弹出窗口。选中设置以显示时,将显示此弹出窗口。弹出窗口是一个本机窗口(我想),所以我不能使用selenium访问它

阅读浏览器控制台——我无法在所有浏览器中都找到这样做的方法。在Chrome中,我找到了一种方法,将控制台日志保存到一个文件中,然后读取该文件。这就是我所能做到的

我想要一个类似于BrowserMob的解决方案,因为它似乎是一个跨浏览器的解决方案。是否有其他代理可以放在测试中并拦截响应?如果实现了
getBody()
方法,那就太好了。我也喜欢父/子解决方案,因为它看起来也是一个简单的跨浏览器解决方案,但它不适用于IE()


感谢您的帮助。

我不知道有什么方法可以通过测试框架直接捕获Javascript代码错误。如果让我猜的话,我会用。或者,也许类似的东西会起作用

作为旁注,如果您使用单独的节点运行Selenium2 Grid Hub,您可以像这样将Java选项传递给节点的JVM,这将允许代理通过Fiddler工作。Fiddler侦听(默认情况下)端口8888。使用此方法,您可以查看数据包

:: batch script: Set JAVA_OPTS java options to JVM
SET "JAVA_OPTS=-Dwebdriver.chrome.^
 driver=%CHROMEDRIVER%"
IF "%PROXY_TO_FIDDLER%"=="true" SET "JAVA_OPTS=%JAVA_OPTS% -DproxySet=true^
 -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=8888"

我创造了。在我看来,您还可以使用此方法与端口8080上的BrowserMob代理进行通信?我没有尝试过。

据我所知,您列出了当前可用的所有可能的解决方案(2013年7月,Selenium 2.33.0)。在出现任何官方API之前,您必须混合使用这些解决方案,或者为您需要支持的每个浏览器编写自己的浏览器插件。您意识到BrowserMob代理是正确的,对吗?是什么阻止了你实现缺少的功能和提交拉取请求?没什么,嗯,也许我知道:p我有时间限制,但如果这是我唯一的选择,那么我肯定可以尝试。感谢您的动机。Browsermob代理尚未覆盖BrowserMobHttpResponse的getBody方法。它返回null。因此无法添加我们自己的javascript。我现在正在使用Fiddler查看数据包,但我没有网格设置。我会调查你的代码。谢谢你的回答/代码。我想页面源代码不会在网格中心和节点之间传递。节点实例上遇到Javascript错误的每个web浏览器会话都位于其自己的沙箱中。在我看来,您使用JQuery注入的想法似乎是实现这一点的唯一方法,但我知道您说过,它没有足够早地捕获错误。我是在推理,但也许您可以在iFrame包装器测试页面框架中加载页面,该框架预加载jquery并控制/监视页面在其iFrame中的加载?在这种情况下,您的测试驱动程序必须进行切换才能进入帧。