在做客服审批平台的自动化时遇到要这样一个业务场景:
A.客服人员对进件处理,可操作选项是“通过”、“退件”、“拒绝”
B.客服人员需要对“退件”、“拒绝”选择做详细原因选择(可多选)
C.客服人员勾选审批意见后,点击“提交”按钮,完成进件审批操作
根据以上整理出简单的思路
1、点定位到“通过”、“退件”、“拒绝”按钮
2、点击“通过”、“退件”、“拒绝”按钮
3、勾选“退件”、“拒绝”的详细原因
4、点击“提交”按钮
根据思路整理出代码如下:
首先需要解决第一步和第二步,先找到按钮的定位,我是将定位表达式写到properties里,以下是三个按钮的定位方法:
Yffin_PendinfoPage.passbtu=xpath>//span/input[@value='102']
Yffin_PendinfoPage.returnbtu=xpath>//span/input[@value='104']
Yffin_PendinfoPage.rejectbtu=xpath>//span/input[@value='109']
以下是代码:
//通过
public void clickPassBtu() {
try {
driver.findElement(new GetObjectMapProperties().getLocator("Yffin_PendinfoPage.passbtu")).click();//找到通过按钮,并点击通过按钮
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//退件
public void clickReturnBtu() {
try {
driver.findElement(new GetObjectMapProperties().getLocator("Yffin_PendinfoPage.returnbtu")).click();//找到退件按钮并点击
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//拒绝
public void clickRejectBtu() {
try {
driver.findElement(new GetObjectMapProperties().getLocator("Yffin_PendinfoPage.rejectbtu")).click();;//找到拒绝按钮并点击
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
然后解决第三步,根绝实际场景,客服人员在选择在“退件”或“拒绝”详细原因时只勾选详细原因并不会一成不变的。因此,可以设计成勾选随机个随机的原因。这样更贴切业务场景。
以退件为例,上图的红色框内是客服人员随机勾选的退件原因。那么需要先定位到所有的退件原因,根据下图的HTML可以写Xpath表达式定位得出:
Yffin_PendinfoPage.returninreasons=xpath>//div[@id='subReturnCheckboxDiv']/div[@id='tjInnerReasons']//input
因此代码如下:
//勾选退件原因
public void checkReturnReasons() throws Exception {
ListfindElements = driver.findElements(new GetObjectMapProperties().getLocator("Yffin_PendinfoPage.returninreasons"));
int max = findElements.size();
System.out.println(max);
int nextInt = new Random().nextInt(max);
System.out.println(nextInt);
for (int i = 0; i < nextInt; i++) {
System.out.println(i);
findElements.get( new Random().nextInt(max)).click();
}
}
通过调试发现以上代码可以实现随机选择退件原因,但是在多次调试后发现一个问题,打印出的nextInt与页面上勾选的不一致,nextInt大于页面勾选的复选框的数量。猜测出现这个状况的原因有两点:一是,在执行过程中确实没有勾选复选框;二是,在执行时某一复选框被执行两次。通过审查代码得出执行for循环时可能产生的随机数与之前一致,那再次点击复选框就会是取消勾选。找到问题的原因后,可以再for循环内加一个判断:如果复选框已经被勾选了,就重新确定复选框。修改后的代码如下:
//勾选退件原因
public void checkReturnReasons() throws Exception {
ListfindElements = driver.findElements(new GetObjectMapProperties().getLocator("Yffin_PendinfoPage.returninreasons"));
int max = findElements.size();
int nextInt = new Random().nextInt(max);
System.out.println(nextInt);
for (int i = 0; i < nextInt; i++) {
int j = new Random().nextInt(max);
while(findElements.get(j).isSelected()){
int m=new Random().nextInt(max);
j=m;
}
findElements.get(j).click();
}
}
以上思路是将所有的退件原因看成一个整体,但是这样并没有贴近真实业务。真实业务步骤是:
1、先判断进件的主处理,根据不同的规则判断选择主按钮是什么?
1.1、如果是通过,则可以直接提交审核结果
1.2、如果是退件或拒绝,需要判断次要处理。比如:进件信息内的公司名称是不合法,主处理是“退件”,则次要处理需要勾选单位名称下的“有误”复选框
这样就需要做的判断和定位比较多,考虑到投入与产出和时间原因,最终的UI自动化的要求只需要做个复选框的随机勾选就可以了。