分离验证码识别事件;添加文本处理断言事件;修改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; package pres.auxiliary.work.selenium.event;
import java.util.function.Function;
import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.TimeoutException; import org.openqa.selenium.TimeoutException;
@ -99,10 +101,13 @@ public class AssertEvent extends AbstractEvent {
*/ */
public boolean assertTextContainKey(Element element, boolean isJudgeAllKey, String... keys) { public boolean assertTextContainKey(Element element, boolean isJudgeAllKey, String... keys) {
//判断是否传入关键词 //判断是否传入关键词
boolean result = true; // boolean result = true;
if (keys != null && keys.length != 0) { // if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getText(element), isJudgeAllKey, false, keys); // result = judgetText(textEvent.getText(element), isJudgeAllKey, false, keys);
} // }
boolean result = assertTextContainKey(element, (e) -> textEvent.getText(e),
isJudgeAllKey, keys);
logText = "断言“" + element.getElementData().getName() + "”元素的文本内容包含" logText = "断言“" + element.getElementData().getName() + "”元素的文本内容包含"
+ (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys); + (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys);
@ -110,7 +115,7 @@ public class AssertEvent extends AbstractEvent {
return result; return result;
} }
/** /**
* <p> * <p>
* 断言元素的文本内容中不包含指定的关键词可设置元素的文本内容是否需要判断传入的所有关键词 * 断言元素的文本内容中不包含指定的关键词可设置元素的文本内容是否需要判断传入的所有关键词
@ -155,10 +160,13 @@ public class AssertEvent extends AbstractEvent {
*/ */
public boolean assertTextNotContainKey(Element element, boolean isJudgeAllKey, String... keys) { public boolean assertTextNotContainKey(Element element, boolean isJudgeAllKey, String... keys) {
//判断是否传入关键词 //判断是否传入关键词
boolean result = true; // boolean result = true;
if (keys != null && keys.length != 0) { // if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getText(element), isJudgeAllKey, true, keys); // result = judgetText(textEvent.getText(element), isJudgeAllKey, true, keys);
} // }
boolean result = assertTextNotContainKey(element, (e) -> textEvent.getText(e),
isJudgeAllKey, keys);
logText = "断言“" + element.getElementData().getName() + "”元素的文本内容不包含" logText = "断言“" + element.getElementData().getName() + "”元素的文本内容不包含"
+ (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys); + (isJudgeAllKey ? "所有" : "部分") + "关键词" + arrayToString(keys);
@ -182,10 +190,12 @@ public class AssertEvent extends AbstractEvent {
public boolean assertAttributeContainKey(Element element, String attributeName, boolean isJudgeAllKey, public boolean assertAttributeContainKey(Element element, String attributeName, boolean isJudgeAllKey,
String... keys) { String... keys) {
//判断是否传入关键词 //判断是否传入关键词
boolean result = true; // boolean result = true;
if (keys != null && keys.length != 0) { // if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getAttributeValue(element, attributeName), isJudgeAllKey, false, keys); // 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 logText = "断言“" + element.getElementData().getName() + "”元素的“" + attributeName
+ "”属性值包含" + "”属性值包含"
@ -209,11 +219,14 @@ public class AssertEvent extends AbstractEvent {
*/ */
public boolean assertAttributeNotContainKey(Element element, String attributeName, boolean isJudgeAllKey, public boolean assertAttributeNotContainKey(Element element, String attributeName, boolean isJudgeAllKey,
String... keys) { String... keys) {
//判断是否传入关键词 // //判断是否传入关键词
boolean result = true; // boolean result = true;
if (keys != null && keys.length != 0) { // if (keys != null && keys.length != 0) {
result = judgetText(textEvent.getAttributeValue(element, attributeName), isJudgeAllKey, true, keys); // 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 logText = "断言“" + element.getElementData().getName() + "”元素的“" + attributeName
+ "”属性值不包含" + "”属性值不包含"
@ -223,6 +236,64 @@ public class AssertEvent extends AbstractEvent {
return 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 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}对象 * @param element {@link Element}对象
@ -235,7 +306,8 @@ public class AssertEvent extends AbstractEvent {
//判断是否传入关键词 //判断是否传入关键词
text = text == null ? "" : text; 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 + ""; logText = "断言“" + element.getElementData().getName() + "”元素的文本内容为“" + text + "";
resultText = String.valueOf(result); resultText = String.valueOf(result);
@ -255,7 +327,8 @@ public class AssertEvent extends AbstractEvent {
//判断是否传入关键词 //判断是否传入关键词
text = text == null ? "" : text; 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 + ""; logText = "断言“" + element.getElementData().getName() + "”元素的文本内容不为“" + text + "";
resultText = String.valueOf(result); resultText = String.valueOf(result);

View File

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