如何为任何给定的驱动程序获取WebDriver客户端日志(JSON有线通信)?

时间:2017-11-05 14:02:14

标签: java selenium logging webdriver selenium-chromedriver

我想在执行命令时获取由webdriver客户端绑定生成的日志。基本上,我想要在客户端和驱动程序之间发生的JSON有线协议通信的日志表示

我尝试为ChromeDriver的Webdriver java客户端执行此操作,但这没有帮助。

System.setProperty("webdriver.chrome.driver","path-to-driver.exe");

DesiredCapabilities caps = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.CLIENT,Level.ALL);
caps.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
ChromeOptions options = new ChromeOptions();
options.merge(caps);

WebDriver driver = new ChromeDriver(options);
System.out.println(driver.manage().logs().getAvailableLogTypes());

输出: enter image description here 如果你看到控制台输出它说: “忽略无法识别的日志类型:客户端”

但是driver.manage()。logs()。getAvailableLogTypes()包含客户端。 有什么帮助吗?

相关问题: Monitoring JSON wire protocol logs

2 个答案:

答案 0 :(得分:1)

要获取chromedriver.exe的WebDriver客户端日志(JSON有线通信),我们可以按如下方式配置logfiletype_of_logging

System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
System.setProperty("webdriver.chrome.logfile", "C:\\Utility\\BrowserDrivers\\chromedriver.log");
System.setProperty("webdriver.chrome.verboseLogging", "true");
WebDriver driver = new ChromeDriver();
driver.get("https://www.google.co.in");
driver.findElement(By.name("q"));
driver.quit();

答案 1 :(得分:0)

这可以通过将Java IDE指向代理服务器而不是捕获IDE和代理服务器之间的整个http流量来轻松完成。您可以在代理中使用一些规则来过滤与JSON有线协议相关的流量。

代理服务器选择可以是Browsermob,CharlesProxy或Fiddler。

另一种选择是:

Selenium Java绑定在内部使用Apache HTTP客户端发送这些json有线协议请求,如果您使用的是sl4j / log4j logger而不是log4j.properties文件,则可以使用以下行:

log4j.logger.org.apache.http.wire = DEBUG

它将启用由apache http客户端生成的所有调试日志记录,然后您将开始查看selenium java客户端和chromedriver服务器之间交换的所有网络流量。以下是为driver.findElement()命令生成的日志:

https://gist.github.com/sahajamit/6a54d8841a0db063c515e2460af260c1

我刚刚浏览了他们的源代码,发现他们根本没有在selenium代码中记录这些有线协议交互。您可以看到以下java方法: https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/remote/http/AbstractHttpCommandCodec.java#L215

他们为find元素命令记录的最大信息是:

执行:findElement [6461ed17770e6252b694ddecd8370093,findElement {using = id,value = gb_70}]

但是如果你想知道这个名为" findElement"的命令使用了哪个有线协议端点。然后引用这个类文件来定义这个映射。

defineCommand(FIND_ELEMENT,post(" / session /:sessionId / element"));

https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/remote/http/AbstractHttpCommandCodec.java#L159