我想在执行命令时获取由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());
输出: 如果你看到控制台输出它说: “忽略无法识别的日志类型:客户端”
但是driver.manage()。logs()。getAvailableLogTypes()包含客户端。 有什么帮助吗?
答案 0 :(得分:1)
要获取chromedriver.exe
的WebDriver客户端日志(JSON有线通信),我们可以按如下方式配置logfile
和type_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"));