selenide
等待奇迹
圣诞节是奇迹的时刻。 在新的一年的前夕,我们都会制定下一个计划。 我们希望所有问题都将在最后一年消失,在来年出现奇迹。
每个Java开发人员都梦想着奇迹,使他成为世界上最有效的Java开发人员。
我想向你展示这样的奇迹。
这就是所谓的自动化测试 !
tests,测试?
是。 借助micro / pico / nano服务,您不会成为真正的主人。 多亏纪律,您才能成为真正的主人。 纪律声称,开发人员仅在编写和运行代码和测试时才报告作业完成 。
但是,测试不是很无聊吗?
哦,不,相信我! 对于最聪明的人来说,编写快速 , 稳定的自动化测试是一个巨大的挑战。 这可能非常有趣。 您只需要使用正确的工具。
编写UI测试的正确工具是:
Selenium化物
Selenide是一个开放源代码库,用于编写简洁而稳定的UI测试。
Selenide是软件开发人员的理想选择,因为它的学习曲线非常低。 因此,您不必费心浏览器详细信息,所有这些典型的ajax和时间问题,而这些时间和问题都占用了QA自动化工程师的大部分时间。
让我们看一个最简单的Selenide测试:
public class GoogleTest {
@Test
public 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()
按Enter。 - 您检查结果 :用
$$
找到所有找到的结果(它返回所有匹配元素的集合)。 您检查集合的大小和内容。
这个测试不容易阅读吗? 这个测试不容易编写吗?
我相信是。
深入细节
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的力量! 专注于业务逻辑。
让世界更美好
我相信,当所有开发人员都开始为其代码编写自动化测试时,World会变得更好。 当开发人员在17:00起床去看孩子时,不用担心他们在最后的改动后会破坏某些东西。
让我们通过编写自动化测试来改善世界!
提供工作软件。
翻译自: https://www.javacodegeeks.com/2015/12/effective-ui-tests-selenide.html
selenide