分离验证码识别事件;添加文本处理断言事件;修改js事件问题

This commit is contained in:
彭宇琦 2020-10-24 19:34:08 +08:00
parent be80eb20e3
commit c977a366e1
3 changed files with 123 additions and 67 deletions

View File

@ -1,5 +1,7 @@
package pres.auxiliary.work.selenium.event;
import java.util.function.Function;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.TimeoutException;
@ -99,10 +101,13 @@ public class AssertEvent extends AbstractEvent {
*/
public boolean assertTextContainKey(Element element, boolean isJudgeAllKey, String... keys) {
//判断是否传入关键词
boolean result = true;
if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getText(element), isJudgeAllKey, false, keys);
}
// boolean result = true;
// if (keys != null && keys.length != 0) {
// result = judgetText(textEvent.getText(element), isJudgeAllKey, false, keys);
// }
boolean result = assertTextContainKey(element, (e) -> textEvent.getText(e),
isJudgeAllKey, keys);
logText = "断言“" + element.getElementData().getName() + "”元素的文本内容包含"
+ (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys);
@ -110,7 +115,7 @@ public class AssertEvent extends AbstractEvent {
return result;
}
/**
* <p>
* 断言元素的文本内容中不包含指定的关键词可设置元素的文本内容是否需要判断传入的所有关键词
@ -155,10 +160,13 @@ public class AssertEvent extends AbstractEvent {
*/
public boolean assertTextNotContainKey(Element element, boolean isJudgeAllKey, String... keys) {
//判断是否传入关键词
boolean result = true;
if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getText(element), isJudgeAllKey, true, keys);
}
// boolean result = true;
// if (keys != null && keys.length != 0) {
// result = judgetText(textEvent.getText(element), isJudgeAllKey, true, keys);
// }
boolean result = assertTextNotContainKey(element, (e) -> textEvent.getText(e),
isJudgeAllKey, keys);
logText = "断言“" + element.getElementData().getName() + "”元素的文本内容不包含"
+ (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys);
@ -182,10 +190,12 @@ public class AssertEvent extends AbstractEvent {
public boolean assertAttributeContainKey(Element element, String attributeName, boolean isJudgeAllKey,
String... keys) {
//判断是否传入关键词
boolean result = true;
if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getAttributeValue(element, attributeName), isJudgeAllKey, false, keys);
}
// boolean result = true;
// if (keys != null && keys.length != 0) {
// result = judgetText(textEvent.getAttributeValue(element, attributeName), isJudgeAllKey, false, keys);
// }
boolean result = assertTextContainKey(element, (e) -> textEvent.getAttributeValue(e, attributeName),
isJudgeAllKey, keys);
logText = "断言“" + element.getElementData().getName() + "”元素的“" + attributeName
+ "”属性值包含"
@ -209,11 +219,14 @@ public class AssertEvent extends AbstractEvent {
*/
public boolean assertAttributeNotContainKey(Element element, String attributeName, boolean isJudgeAllKey,
String... keys) {
//判断是否传入关键词
boolean result = true;
if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getAttributeValue(element, attributeName), isJudgeAllKey, true, keys);
}
// //判断是否传入关键词
// boolean result = true;
// if (keys != null && keys.length != 0) {
// result = judgetText(textEvent.getAttributeValue(element, attributeName), isJudgeAllKey, true, keys);
// }
boolean result = assertTextNotContainKey(element, (e) -> textEvent.getAttributeValue(e, attributeName),
isJudgeAllKey, keys);
logText = "断言“" + element.getElementData().getName() + "”元素的“" + attributeName
+ "”属性值不包含"
@ -223,6 +236,64 @@ public class AssertEvent extends AbstractEvent {
return result;
}
/**
* 对元素内容进行处理并断言处理后的文本内容中包含指定的关键词
* 可设置元素的文本内容是否需要判断传入的所有关键词具体参数介绍
* 可参考{@link #assertTextContainKey(Element, boolean, String...)}方法
*
* @param element {@link Element}对象
* @param dispose 对元素内容的处理方法传入的参数为{@link Element}对象返回的参数为字符串
* @param isJudgeAllKey 是否需要完全判断所有关键词
* @param keys 关键词组
* @return 断言结果
* @throws TimeoutException 元素无法操作时抛出的异常
* @throws NoSuchElementException 元素不存在或下标不正确时抛出的异常
*/
public boolean assertTextContainKey(Element element, Function<Element, String> dispose, boolean isJudgeAllKey, String... keys) {
//判断是否传入关键词
boolean result = true;
String text = "";
if (keys != null && keys.length != 0) {
text = dispose.apply(element);
result = judgetText(text, isJudgeAllKey, false, keys);
}
logText = "断言“" + element.getElementData().getName() + "”元素处理后的文本内容(" + text +")包含"
+ (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys);
resultText = String.valueOf(result);
return result;
}
/**
* 对元素内容进行处理并断言处理后的文本内容中不包含指定的关键词
* 可设置元素的文本内容是否需要判断传入的所有关键词
* 具体参数介绍可参考{@link #assertTextContainKey(Element, boolean, String...)}方法
*
* @param element {@link Element}对象
* @param dispose 对元素内容的处理方法传入的参数为{@link Element}对象返回的参数为字符串
* @param isJudgeAllKey 是否需要完全判断所有关键词
* @param keys 关键词组
* @return 断言结果
* @throws TimeoutException 元素无法操作时抛出的异常
* @throws NoSuchElementException 元素不存在或下标不正确时抛出的异常
*/
public boolean assertTextNotContainKey(Element element, Function<Element, String> dispose, boolean isJudgeAllKey, String... keys) {
//判断是否传入关键词
boolean result = true;
String text = "";
if (keys != null && keys.length != 0) {
text = dispose.apply(element);
result = judgetText(text, isJudgeAllKey, true, keys);
}
logText = "断言“" + element.getElementData().getName() + "”元素处理后的文本内容(" + text +")包含"
+ (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys);
resultText = String.valueOf(result);
return result;
}
/**
* 用于断言元素的内容与预期的文本一致
* @param element {@link Element}对象
@ -235,7 +306,8 @@ public class AssertEvent extends AbstractEvent {
//判断是否传入关键词
text = text == null ? "" : text;
boolean result = judgetText(textEvent.getText(element), true, false, text);
// boolean result = judgetText(textEvent.getText(element), true, false, text);
boolean result = assertTextContainKey(element, true, text);
logText = "断言“" + element.getElementData().getName() + "”元素的文本内容为“" + text + "";
resultText = String.valueOf(result);
@ -255,7 +327,8 @@ public class AssertEvent extends AbstractEvent {
//判断是否传入关键词
text = text == null ? "" : text;
boolean result = judgetText(textEvent.getText(element), true, true, text);
// boolean result = judgetText(textEvent.getText(element), true, true, text);
boolean result = assertTextNotContainKey(element, true, text);
logText = "断言“" + element.getElementData().getName() + "”元素的文本内容不为“" + text + "";
resultText = String.valueOf(result);

View File

@ -47,6 +47,7 @@ public class JsEvent extends AbstractEvent {
*/
public JsEvent(AbstractBrower brower) {
super(brower);
js = (JavascriptExecutor) brower.getDriver();
}
/**

View File

@ -3,7 +3,6 @@ package pres.auxiliary.work.selenium.event;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Random;
import org.openqa.selenium.Keys;
import org.openqa.selenium.NoSuchElementException;
@ -160,7 +159,9 @@ public class TextEvent extends AbstractEvent {
* @return 输入的内容
* @throws TimeoutException 元素无法操作时抛出的异常
* @throws NoSuchElementException 元素不存在或下标不正确时抛出的异常
* @deprecated 下个版本删除该方法改为使用{@link #getImageText(Element)}{@link #input(Element, String)}方法结合代替
*/
@Deprecated
public String codeInput(Element textElement, Element codeImageElement) {
actionOperate(codeImageElement, null);
// 判断验证码信息是否加载加载后获取其Rectang对象
@ -191,58 +192,39 @@ public class TextEvent extends AbstractEvent {
return resultText;
}
/**
* 该方法用于将一个指定的整数随机填写到传入的控件组中<br>
* <b><i>建议在指定值远远大于控件的数量时再使用该方法否则将会出现不可预期的问题</i></b>
*
* @param num 指定的整数
* @param textElements 通过查找页面得到的一组控件元素对象
* @return 由于涉及到多个文本框故其返回值有多个将以值1,值2,值3...的形式进行返回
* @deprecated 当前方法有些BUG请勿调用下个版本修复
* @throws TimeoutException 元素无法操作时抛出的异常
* @throws NoSuchElementException 元素不存在或下标不正确时抛出的异常
* 用于对数字+英文类型的图片内容进行识别的方法根据图片元素位置识别图片中的内容
* 注意该方法识别成功的概率不高数字+英文的模式下经常将数字识别为英文
* @param element 图片元素
* @return 识别图片的结果
*/
@Deprecated
public String avgIntergeInput(int num, Element... elements) {
//TODO 存在BUG需要修改
//定义存储控件数量及需要随机的数量
int contrlNum = elements.length;
String inputNumText = "";
String[] inputNum = new String[contrlNum];
// 向下取整获得平均数
int avgNum = num / contrlNum;
// 向上取整获得差值
int diffNum = (int) Math.ceil(avgNum / 10.0);
public String getImageText(Element element) {
actionOperate(element, null);
// 判断验证码信息是否加载加载后获取其Rectang对象
Rectangle r = webElement.getRect();
// 构造截图对象并创建截图
Screenshot sc = new Screenshot(brower.getDriver(), new File("Temp"));
File image = null;
try {
image = sc.creatImage("code");
} catch (WebDriverException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//求取通过随机得出的值之和用于计算最终其随机值之和与实际值的差值
int sum = 0;
//循环生成控件个数个随机值其随机值在给定数值的均值之前
for (int i = 0; i < contrlNum; i++) {
//注意2 * diffNum为以下算式的简写
//minNum = avgNum - diffNum;
//maxNum = avgNum + diffNum;
//int ranNum = new Random().nextInt(maxNum - minNum + 1) + minNum;
int ranNum = new Random().nextInt(2 * diffNum + 1) + (avgNum - diffNum);
sum += ranNum;
inputNum[i] = String.valueOf(ranNum);
}
// 设置图片识别的语言包存放位置
RecognitionImage.setTessdataPath(new File(TESSDATA));
// 识别图片并存储至结果中
resultText = RecognitionImage.judgeImage(image, r.x, r.y, r.width, r.height);
//由于数值是随机的可能会出现随机值相加不为指定值故需要补上差值但由于差值通过算法后不会很大故可随机附加到一个控件值上
if ( (diffNum = sum - num) != 0 ) {
inputNum[new Random().nextInt(contrlNum)] = String.valueOf(Integer.valueOf(inputNum[new Random().nextInt(contrlNum)]) - diffNum);
}
logText = "识别“" + element.getElementData().getName() + "”图片中内容,内容为:"
+ resultText;
//将随机值填写至控件中
for (int i = 0; i < contrlNum; i++) {
inputNumText += (input(elements[i], inputNum[i]) + ",");
}
return inputNumText.substring(0, inputNumText.length() - 1);
return resultText;
}
/**
* 用于向控件中上传指定的文件
*