背景
在LuckyFrame当前的版本中,仅有timeout隐式等待和Wait强制等待。在实际的用例编写过程中,需要等待元素显示或者元素消失时(如等待loading浮层消失),不够方便灵活,很容易出现等待时间不够或者浪费时间的情况,所以添加一个自定义的显示等待关键字。
代码实现
可在LukcyFrameClient项目的 EncapsulateOperation类-》objectOperation方法的switch下添加显示等待关键字代码。
case "waitvisibility":
// 显式等待元素可见
WebDriverWait wait1=new WebDriverWait(wd,Long.parseLong(operationValue));
switch (property) {
case "id":
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.id(propertyValue)));
break;
case "name":
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.name(propertyValue)));
break;
case "xpath":
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(propertyValue)));
break;
case "linktext":
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.linkText(propertyValue)));
break;
case "tagname":
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.tagName(propertyValue)));
break;
case "cssselector":
wait1.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(propertyValue)));
break;
default:
break;
}
break;
case "waitnotvisibility":
// 显式等待元素消失
WebDriverWait wait4=new WebDriverWait(wd,Long.parseLong(operationValue));
switch (property) {
case "id":
wait4.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.id(propertyValue))));
break;
case "name":
wait4.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.name(propertyValue))));
break;
case "xpath":
wait4.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath(propertyValue))));
break;
case "linktext":
wait4.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.linkText(propertyValue))));
break;
case "tagname":
wait4.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.tagName(propertyValue))));
break;
case "cssselector":
wait4.until(ExpectedConditions.not(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.cssSelector(propertyValue))));
break;
default:
break;
}
break;
数据库插入关键字
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('3044', '51', 'waitvisibility显式等待元素可见', 'waitvisibility', 'testmanagmt_casestep_uioperation', '', 'info', 'Y', '0', 'admin', '2019-02-13 10:27:32', 'luckyframe', '2019-02-13 10:27:32', '显式等待元素可见');
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES ('3045', '52', 'waitnotvisibility显式等待元素消失', 'waitnotvisibility', 'testmanagmt_casestep_uioperation', '', 'info', 'Y', '0', 'admin', '2019-02-13 10:27:32', 'luckyframe', '2019-02-13 10:27:32', '显式等待元素消失');
替换class文件
将EncapsulateOperation.java文件重新编译后,替换到LuckyFrameClient对应的目录,重启客户端即可。
使用
另:
在使用该框架的过程中的一些痛点,比如同一套用例无法在多个环境执行,多个计划无法聚合到一个调度任务里统一执行,一些实用的自定义关键字等都已实现。待有时间再写上来吧。
感谢
附上luckyframe项目官网的地址 http://www.luckyframe.cn,感谢作者开发这么好用的自动化平台,强力推荐!