使用Selenide进行有效的UI测试

等待奇迹

圣诞节是奇迹的时刻。 在新的一年的前夕,我们都为下一年制定了计划。 我们希望所有问题都将在最后一年消失,在来年出现奇迹。

每个Java开发人员都梦想着创造一个奇迹,使他成为世界上最有效的Java开发人员。

我想向你展示这样的奇迹。

这就是所谓的自动化测试

tests,测试?

是。 由于micro / pico / nano服务,您不会成为真正的主人。 多亏纪律,您才能成为真正的主人。 纪律声称,开发人员仅在编写和运行代码和测试时才报告作业完成

但是,测试不是很无聊吗?

哦,不,相信我! 对于最聪明的人来说,编写快速稳定的自动化测试是一个巨大的挑战。 这可能非常有趣。 您只需要使用正确的工具。

编写UI测试的正确工具是:

硒化物

Selenide是一个开放源代码库,用于编写简洁而稳定的UI测试。

Selenide是软件开发人员的理想选择,因为它的学习曲线非常低。 因此,您无需费心浏览器详细信息,所有这些典型的ajax和时间问题,而这些时间和问题都占用了QA自动化工程师的大部分时间。

让我们看一个最简单的Selenide测试:

public class GoogleTest {@Testpublic void user_can_search_everything_in_google() {open("http://google.com/ncr");$(By.name("q")).val("selenide").pressEnter();$$("#ires .g").shouldHave(size(10));$("#ires .g").shouldBe(visible).shouldHave(text("Selenide: concise UI tests in Java"),text("selenide.org"));}
}

让我们仔细看看这里发生的情况。

  • 您只需open(url)一个命令即可open(url) 浏览器 open(url)
  • 可以在命令$的页面上找到一个元素
    您可以按名称,ID,CSS选择器,属性,xpath甚至按文本查找元素。
  • 您可以操纵元素 :使用val()输入一些文本,然后使用(surprise-surprise!) pressEnter()按下回车键。
  • 检查结果 :用$$查找所有找到的结果(它返回所有匹配元素的集合)。 您检查集合的大小和内容。

这个测试不容易阅读吗? 这个测试不容易编写吗?

我相信是。

深入细节

Ajax /时序问题

如今,Web应用程序是动态的。 每个应用程序都可以随时动态呈现/更改。 这给自动化测试带来了很多问题。 今天测试为绿色的测试随时可能突然变成红色,这是因为浏览器执行某些JavaScript的时间比平常更长。

这真是ajjaxx的痛苦

令人难以置信的是,Selenide用一种非常简单的方式解决了大多数这些问题。

简而言之, 如果需要 ,每种Selenide方法都会等待一点。 人们称其为“智能等待”。

当你写:

$("#menu").shouldHave(text("Hello"));

Selenide检查元素是否存在并包含文本“ Hello”。

如果还没有,Selenide假定该元素可能很快就会动态更新,并稍等片刻,直到它发生。 默认超时为4秒,通常对于大多数Web应用程序来说足够了。 当然,它是可配置的。

丰富的匹配器

您可以使用Selenide检查几乎所有内容。 使用上面提到的“智能等待”机制。

例如,您可以检查元素是否存在。 如果还没有,Selenide将等待最多 4秒钟。

$(".loading_progress").shouldBe(visible);

您甚至可以检查该元素存在。 如果仍然存在,Selenide将等待4秒钟,直到消失。

$(By.name("gender")).should(disappear);

您可以使用流利的API和链方法来使您的测试真正简洁:

$("#menu").shouldHave(text("Hello"), text("John!")).shouldBe(enabled, selected);

馆藏

Selenide允许您使用集合,因此只需一行代码即可检查许多元素。

例如,您可以检查页面上是否确实有N个元素:

$$(".error").shouldHave(size(3));

您可以找到集合的子集:

$$("#employees tbody tr").filter(visible).shouldHave(size(4));

您可以检查元素的文本。 在大多数情况下,检查整个表或表行就足够了:

$$("#employees tbody tr").shouldHave(texts("John Belushi","Bruce Willis","John Malkovich")
);

上传/下载文件

使用Selenide上传文件非常容易:

$("#cv").uploadFile(new File("cv.doc"));

您甚至可以一次上传多个文件:

$("#cv").uploadFile(new File("cv1.doc"),new File("cv2.doc"),new File("cv3.doc")
);

下载文件非常简单:

File pdf = $(".btn#cv").download();

测试“高度动态”的Web应用程序

一些Web框架(例如GWT)生成HTML绝对不可读。 元素没有恒定的ID或名称。

这是xpathh中的真正痛苦

Selenide建议通过按文本搜索元素来解决此问题。

import static com.codeborne.selenide.Selectors.*;$(byText("Hello, Devoxx!"))     // find by the whole text.shouldBe(visible);$(withText("oxx"))              // find by substring.shouldHave(text("Hello, Devoxx!"));

通过文本搜索根本不是一个坏主意。 实际上,我喜欢它是因为它模仿了真实用户的行为。 实际用户无法通过ID或XPATH找到按钮,而是通过文本(或者颜色)找到按钮。

另一套有用的Selenide方法使您可以在父母和孩子之间导航。

$("td").parent()
$("td").closest("tr")
$(".btn").closest(".modal")
$("div").find(By.name("q"))

例如,您可以按文本找到表格单元格,然后按其最接近的tr后裔找到表格单元格,并在此表格行内找到“保存”按钮:

$("table#employees").find(byText("Joshua")).closest("tr.employee").find(byValue("Save")).click();

…和许多其他功能

Selenide具有更多功能,例如:

$("div").scrollTo();
$("div").innerText();
$("div").innerHtml();
$("div").exists();
$("select").isImage();
$("select").getSelectedText();
$("select").getSelectedValue();
$("div").doubleClick();
$("div").contextClick();
$("div").hover();
$("div").dragAndDrop()
zoom(2.5);
...

但好消息是您不需要记住所有这些东西。 只需放入$,放入点,然后从IDE建议的可用选项中进行选择。

使用IDE的力量! 专注于业务逻辑。

ide-just-start-typing

让世界更美好

我相信,当所有开发人员都开始为其代码编写自动化测试时,World会变得更好。 当开发人员在17:00起床去看孩子时,不用担心他们在最后的改动后会破坏某些东西。

让我们通过编写自动化测试来改善世界!

提供工作软件。

翻译自: https://www.javacodegeeks.com/2015/12/effective-ui-tests-selenide.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356026.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android之seekbar

做了一个拖动滑块改变数值的demo 下附上代码: <SeekBar android:id"id/myseekbar" android:layout_width"match_parent" android:layout_marginTop"20dp" android:thumb"drawable/slider" android:layout_height&qu…

php 微信小程序 循环 多选,微信小程序实现多选功能

本文为大家分享了微信小程序实现多选功能的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下代码&#xff1a;{{num 1}}/{{quesyion.length}}{{question[num][0]}}A {{question[num][1]}}B {{question[num][2]}}C {{question[num][3]}}D {{question[num][4]}}正确答案…

今天在看慕课网的java学习路径

new对象是静态加载类 在编译时刻就需要加载所有可能使用的类 如果有有一个类没有 其他的类也无法使用 通过动态加载类可以解决这个问题 class for name 打印异常栈轨迹Stack Trace。说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方法 classforName //加载…

php+反序列化代码执行漏洞,PHP反序列化漏洞

0x001 漏洞产生原理在反序列化的过程中自动触发了某些魔术方法。未对用户输入的序列化字符串进行检测&#xff0c;导致攻击者可以控制反序列化过程&#xff0c;从而导致XSS、代码执行、文件写入、文件读取等不可控后果。0x002 漏洞触发条件一般只能通过代码审计的方式挖掘该漏洞…

java 应用程序 gui_Java GUI应用程序关闭陷阱

java 应用程序 gui最近&#xff0c;我遇到了一个或两个Java GUI应用程序在关闭时无法关闭的问题。 他们似乎是一个过程&#xff0c;消耗着计算机资源。 今天&#xff0c;我深入探究了问题的根源&#xff0c;这是一个我以前不曾意识到的棘手陷阱&#xff0c;所以我想我会分享一下…

php动态成本管理,网上审批系统环境下的动态目标成本管理

1.预测目标价格和销售量目标价格是根据市场可接受的价格范围、企业自身的竞争优势和企业的经营理念等因素来确定的。在确定目标价格的同时&#xff0c;需要确定在这种价格下企业的预计销售量&#xff0c;因为销售量影响生产量&#xff0c;生产量影响作业量&#xff0c;作业量影…

学习进度(第三周)

所花时间 9.5h 代码量 350行 博客量 2篇 了解到的知识点 Hadoop HBase数据库 转载于:https://www.cnblogs.com/yifengyifeng/p/6542224.html

Java中的值类型:为什么它们不可变?

值类型不必是不变的。 但是他们是。 在上一篇文章中&#xff0c;我讨论了Java中指针与引用之间的区别以及如何传递方法参数&#xff08;按值传递或按引用传递&#xff09;。 这些与Java中尚不存在的值类型密切相关&#xff08;尚未&#xff09;。 John Rose&#xff0c;Brian…

mac设置首页访问php,mac系统下php项目除了首页全访问不了

有网友反映mac配置apache的有问题&#xff0c;除了首页全都访问不了&#xff0c;小编找来了相关的解决办法&#xff0c;有需要的朋友可以来了解一下。httpd.conf配置文件中加载了mod_rewrite.so模块AllowOverride None 将None改为 AllDocumentRoot "/Library/WebServer/Do…

java filter 模式,Java设计模式----过滤器模式(挑三拣四)

过滤器模式描述拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器&#xff0c;并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志&#xff0c;或者跟踪请求&#xff0c;然后把请求传给相…

表单

表单本身也是DOM树 表单的输入框、下拉框等可以接收用户输入&#xff0c;所以用JavaScript来操作表单&#xff0c;可以获得用户输入的内容&#xff0c;或者对一个输入框设置新的内容。 HTML表单的输入控件主要有以下几种&#xff1a; 文本框&#xff0c;对应的<input type&q…

java项目processes设置,Jvm调优和SpringBoot项目优化的详细教程

参考文章1、先看一下未设置JVM参数的情况&#xff0c;默认情况下&#xff0c;没有设置任何Jvm参数。2、设置Jvm参数。配置参数&#xff1a;关于这些设置的JVM参数是什么意思&#xff0c;参考Jvm调优。-XX:MetaspaceSize128m (元空间默认大小)-XX:MaxMetaspaceSize128m (元空间最…

Git问题Everything up-to-date解决

Git问题Everything up-to-date解决 【自己的亲身错误体验】 我的上一篇博客&#xff0c;说了怎么上传一个项目到git远程上面。今天我写好一个小栗子&#xff0c;准备再次上传的时候。我依旧是放在我的F:\github\js- 这个和我的github上的远程仓库相同名称的文件中的 在这里空白…

java超出gc开销限制_超出了GC开销限制– Java堆分析

java超出gc开销限制这篇文章是我们原来的GC开销超出问题模式的延续。 正确的Java堆分析对于消除O​​utOfMemoryError&#xff1a;GC开销问题至关重要。 如果您不熟悉此Java HotSpot 1.6错误&#xff0c;建议您首先阅读有关此主题的第一篇文章 。 本文将为您提供一个示例程序和…

Java接口long类型精度丢失,解决前后端交互Long类型精度丢失问题

雪花算法ID&#xff0c;对应的后端Long类型&#xff0c;前端number类型&#xff0c;它们的精度不一样&#xff0c;导致精度丢失现象雪花算法得到的ID较长&#xff0c;传到前端后&#xff0c;精度丢失库中&#xff1a;23754851322302474后端&#xff1a;23754851322302474前端&a…

如何模拟Spring bean(版本2)

大约一年前&#xff0c;我写了一篇博客文章如何模拟Spring Bean 。 所描述的模式对生产代码几乎没有侵入性。 正如读者Colin在评论中正确指出的那样&#xff0c;基于Profile注释的间谍/模拟Spring bean是更好的选择。 这篇博客文章将描述这种技术。 我在工作中以及副项目中都成…

eclipse和jdk的版本问题,比如printf()出错

1.右键项目选中properties 2.Java Builder Path 》》》Libraries》》》选中JRE Syste Library[jre7]然后remove 3.Add Library》》》JRE Syetem Library》》》NEXT》》》Alternate JRE:选中最新的jie版本 4.Finish》》》OK&#xff01; 5.再在右键项目选中properties 》》》Ja…

java自定义一个timeout,Timeout操作符 RxJava 学习笔记二十一

timeout用于检测在给定时间内observables没有及时响应。如果指定的时间量没有发出任何项目&#xff0c;则超时会使observables失败并出现TimeoutException。我们将从debounce的示例中重用我们的observable来演示超时。输出&#xff1a;只要值不超过200ms&#xff0c;就会输出。…

用xshell ssh连接测试服务器时候出的问题

问题还原&#xff1a;用ssh连接测试服务器 给我结结实实报了个错 FBIwarning: ----------------------------------------------------------------------------------------------------------------------------以上 问题还原 解决过程&#xff1a;百度 博客地址http://blog.…

maven集成spring_Maven集成测试和Spring Restful Services

maven集成spring介绍 我的原始博客通过一个非常简单的示例展示了如何分离Maven单元和集成测试。 http://johndobie.blogspot.com/2011/06/seperating-maven-unit-integration-tests.html此后&#xff0c;许多人要求我提供比最初使用的示例更实际的示例。 这篇文章显示了如何在实…