今天同事遇到一个奇怪的问题,Testng测试代码在本地和虚拟机的eclipse上执行没有问题,在jenkins上执行报md5校验错误。从日志可以看出,测试代码中需要做hash的字符串中有中文,初步判断跟字符编码有关系。调用md5方法的入参是String,跟踪代码发现,String需要转换为byte[],在转byte[]的时候,没有指定字符集则使用默认字符集,默认的字符集来自系统属性file.encoding:

java.nio.charset.Charset

通过在ant加输出日志,发现jenkins上执行时, file.encoding属性为GBK,而通过visualvm检查本地eclipse执行的程序,file.encoding属性为UTF-8,JVM arguments页可以看到-Dfile.encoding=UTF-8,也就是说eclipse跟据我们项目的编码自动加了参数。

根据以上分析,有2种解决方案:
1、在ant执行tesgng中加入参数 <sysproperty key=”file.encoding” value=”UTF-8” />
2、在hash的时候传入正确编码的byte[],而不是String。

今天遇到个奇怪的问题,webdriver使用xpath定位,总是定位不到。

网页原文

想用 //ul[@id = ‘LM_SYSFD_UL’]/li/span 定位到第一个圈圈中的元素,结果总是找到第二个元素。

用chorme的控制台查找元素,发现定位到2个元素,太可爱了。

控制台输出

猜测webdriver大概是默认选择最后一个元素。既然存在这样的问题,那么就需要跟精确的办法来定位元素,我们给xpath加点料:

//ul[@id='LM_SYSFD_UL']/li[.//span[text()='收件箱']]/span

使用xpath的谓语功能,先精确定位li,然后再定位到span。

通常我们看到的xpath谓语,不是属性就是函数,其实谓语也可以是一个子节点的xpath,类似与css selector的has语法。

另外还需要说的是 .// 这个用法,它表示当前节点的子孙节点,如果用 // 那就完全变味了,表示的是根节点下的某个子孙节点。

今天调试一个Java测试项目时出现报错:

Cause: com.ibatis.sqlmap.client.SqlMapException: There is already a statement named XXXX in this SqlMap.

增加调试参数 -verbose:class 发现报错的相关Jar出现2个不同版本。

为什么会带来这样的问题:
1、测试项目为了调试方便依赖了一堆其他项目
2、项目全部依赖ivy
3、某个项目的ivy相关Jar做了升级,其他项目未升级
4、加载ibatis的xml使用了classpath*,不同的版本的jar,Spring会当作2个不同的资源来处理
Failed to parse mapping resource: URL [jar:file:/D:/Local_Repository/ivy-cache/xxx/xxx/jars/xxx-1.5.0.10.jar!/xxx/xxx/xxx.xml];

解决办法:
1、项目的ivy使用了 rev=”latest.integration”,依赖的全部项目都要做Resolve。
2、使用ivy的 Show in Reverse Dependency Explorer 中的 Show all projects in workspace 功能检查jar的冲突

在我们的自动化测试过程中,总是会碰到各种难搞的问题,比如说我们需要取标签外的文本信息,今天又被问到这个问题,所以重贴旧文。

<div id="div1">
    <span name="p1">div1</span>废话1
    <span name="p1">div2</span>废话2
    <span name="p1">div3</span>废话3
    <span name="p1">div4</span>废话4
</div>

对于上面的HTML,如果我们想获取 “废话1”、“废话2”之类的文字,使用Webdriver 的 findElement是没有办法解决的,必须想起他办法解决。首先,我们了解一个概念,”废话1”这种,在HTML DOM里面叫做 textNode,是可以设置和获取的。

Read More

linux查看系统内存常用命令free中有2个重要的参数buffers和cached:

                     total       used       free     shared    buffers     cached
Mem:      16436192   10914412    5521780          0     502256    5795248
-/+ buffers/cache:    4616908   11819284
Swap:      4096532        116    4096416

这2个参数到底是什么意思,百度了各种文章,大多概念混淆、含糊不清,难以得到满意的答案,今天做一个源码探索,发现free原来就是获取/proc/meminfo中对应的参数。

执行 free;cat /proc/meminfo,两边的 buffers、cached完全一致

             total       used       free     shared    buffers     cached
Mem:      16436192   10914716    5521476          0     502256    5795248
-/+ buffers/cache:    4617212   11818980
Swap:      4096532        116    4096416
——————————————————————————————————————————————————————————————————————————
MemTotal:     16436192 kB
MemFree:       5521468 kB
Buffers:        502256 kB
Cached:        5795248 kB
SwapCached:         12 kB
Active:        6215352 kB
Inactive:      4218000 kB
HighTotal:           0 kB
.....
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

不仅仅如此,top、vmstat、uptime等等一堆重要的命令中的数据都来自于/proc下的文件。

下面就聊聊源码的探索过程。

Read More