在WebDriver中,我们需要确保各浏览器的版本与相应的driver能够对应一致,不然在实际的UI自动化测试过程中可能会出现一些稳定性问题。
浏览器的版本,我们在打开浏览器之后,一般可以通过“关于”来确定;相应的driver可以在下载时保存的文件夹带版本名。但是在浏览器或者driver版本较多或者有大量的机群需要维护时,有没有办法通过编程来获取浏览器和driver的信息呢?
首先我们来看driver信息的获取。由于driver是可执行文件,根据习惯,我们加上--version看时候有输出(下文都以windows10为例):
可以看到chromedriver能正确输出其版本信息。
geckodriver也可以输出版本信息。
这是,我们就可以通过编程实现了:
Process process = Runtime.getRuntime().exec("D:\\dev\\selenium\\chromedriver_win32_2.43\\chromedriver.exe --version");
Pattern pattern = Pattern.compile("ChromeDriver ([\\d\\.]+).*?");
String output = IOUtils.toString(process.getInputStream(), "gbk");
Matcher matcher = pattern.matcher(output);
if(matcher.find()){
System.out.println(matcher.group(1));
}
下面再看看浏览器版本的获取。首先我们试试chrome --version,实际结果是启动了浏览器;firefox --version也不能显示浏览器版本信息。在windows上,有一个FileVersionInfo的类可以获取可执行文件的信息,比如我们可以看chrome.exe的信息:
在Java里,我们可以使用https://github.com/kichik/pecoff4j 开源的方法:
PE pe = PEParser.parse("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
ResourceDirectory rd = pe.getImageData().getResourceTable();
ResourceEntry[] entries = ResourceHelper.findResources(rd, ResourceType.VERSION_INFO);
for (int i = 0; i < entries.length; i++) {
byte[] data = entries[i].getData();
VersionInfo version = ResourceParser.readVersionInfo(data);
StringFileInfo strings = version.getStringFileInfo();
StringTable table = strings.getTable(0);
for (int j = 0; j < table.getCount(); j++) {
String key = table.getString(j).getKey();
String value = table.getString(j).getValue();
if(key.equalsIgnoreCase("FileVersion")){
System.out.println(value);
}
}
}
另外一个需要解决的问题,就是如何获取浏览器的地址。我们都知道windows上安装的软件在注册表中都会保存有信息,所以我们可以通过读取注册表来解决这个问题。读取注册表的方法有很多,这里不在赘述JNA的实现,只是说一下不依赖三方组件的方法。直接上例子:
本质就是执行reg query来查询注册表的键值,后面就和上文获取driver版本的代码一样了。
与windows不同,linux上获取浏览器的版本信息要方便一些,上图:
关注:测试领域专家(头条&微信)获取第一时间文章更新。