diff --git a/src/main/java/pres/auxiliary/work/selenium/event/AssertEvent.java b/src/main/java/pres/auxiliary/work/selenium/event/AssertEvent.java index e9b24a1..d88a30b 100644 --- a/src/main/java/pres/auxiliary/work/selenium/event/AssertEvent.java +++ b/src/main/java/pres/auxiliary/work/selenium/event/AssertEvent.java @@ -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; } - + /** *

* 断言元素的文本内容中不包含指定的关键词。可设置元素的文本内容是否需要判断传入的所有关键词,即 @@ -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 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 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); diff --git a/src/main/java/pres/auxiliary/work/selenium/event/JsEvent.java b/src/main/java/pres/auxiliary/work/selenium/event/JsEvent.java index e259126..5c8ccf6 100644 --- a/src/main/java/pres/auxiliary/work/selenium/event/JsEvent.java +++ b/src/main/java/pres/auxiliary/work/selenium/event/JsEvent.java @@ -47,6 +47,7 @@ public class JsEvent extends AbstractEvent { */ public JsEvent(AbstractBrower brower) { super(brower); + js = (JavascriptExecutor) brower.getDriver(); } /** diff --git a/src/main/java/pres/auxiliary/work/selenium/event/TextEvent.java b/src/main/java/pres/auxiliary/work/selenium/event/TextEvent.java index f6b891a..1120d9c 100644 --- a/src/main/java/pres/auxiliary/work/selenium/event/TextEvent.java +++ b/src/main/java/pres/auxiliary/work/selenium/event/TextEvent.java @@ -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; } - + /** - * 该方法用于将一个指定的整数随机填写到传入的控件组中
- * 建议在指定值远远大于控件的数量时再使用该方法,否则将会出现不可预期的问题 - * - * @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; } - - + /** * 用于向控件中上传指定的文件。 *