Selenide一个比Selenium更优秀的框架

Selenide介绍


给大家介绍一款国外开源的一款基于WebDriver的自动化框架(Java)

Jetbrains 2020.1版本已经支持selenide

现在github已经1.1k Star了,社区也很活跃。那么他到底有什么特点呢,跟Selenium比有什么区别呢?

配置

<dependency>
    <groupId>com.codeborne</groupId>
    <artifactId>selenide</artifactId>
    <version>5.11.1</version>
    <scope>test</scope>
</dependency>
//开始测试,我们只需三步 
open("/login"); //打开浏览器
$("#submit").click(); //点击
$(".message").shouldHave(text("Hello")); //断言

当然这些是不够的,下面详细介绍一下Selenide的特点。

Selenide的特点

简洁流畅的API,支持链式调用

打开浏览器

selenium:

driver.get("https://www.baidu.com/");

selenide

open("https://www.baidu.com/");

查询页面元素

selenium:

driver.findElement(By.xxx(""));//单元素

driver.findElements(By.xxx(""));//多元素

selenide

$ or $$

?这是什么,是不是很简洁?是的 just $ or $$

通过$ or $$就替换掉了driver.findElement(By.xxx(""));或driver.findElements(By.xxx(""));。

如图:Selenide支持如下定位

// 例子
$(byText("Login")).shouldBe(visible));
$(By.xpath("//div[text()='Login']")).shouldBe(visible); // shouldBe在后面介绍
$(byXpath("//div[text()='Login']")).shouldBe(visible); 
对元素的操作方法
  • click() //点击
  • doubleClick() //双击
  • contextClick() //点击鼠标右键
  • hover() //模仿“鼠标悬停”事件。 换句话说,移动鼠标光标移到该元件(不点击)。
  • setValue(String) / val(String) //输入
  • pressEnter() //按ENTER键
  • pressEscape() //按Esc键
  • pressTab() //按Tab键
  • selectRadio(String value) //选择单选按钮
  • selectOption(String)//从下拉列表,选择一个选项
  • append(String) //追加给定的测试文本字段,并触发“改变”事件
  • dragAndDropTo(String) //拖放一个元素到目标
获取元素状态
  • getValue() / val() //获取元素的"值"属性
  • data() //获取属性的值
  • attr(String) //获取元素的属性。 同义词的getAttribute
  • text()// 返回"页面上的可见文本"
  • innerText()// 返回"DOM中的元素文本"
  • getSelectedOption()
  • getSelectedText()
  • getSelectedValue()
  • isDisplayed() //检查是否存在此元素可见
  • exists() //检查元素是否存在
搜索元素(支持层次搜索)
  • filterBy(Condition)/filter(Condition)//返回符合要求的元素(返回一个集合)
  • excludeWith(Condition) / exclude(Condition) //排除那些满足条件的元素(返回一个集合)
  • last() //返回最后一个元素
  • first() //返回第一个元素
  • find(Condition) / findBy(Condition)//找到满足给定条件的第一个元素
$$("#list li").filterBy(cssClass("enabled")).findBy(exactText("foo")).find(".remove").click();
//取代
$(By.xpath("//*[@id='list']//li[@class='enabled' and .//text()='foo']//*[@class='remove']")).click();
浏览器管理方法
  • isChrome() //判断是否是Chorome
  • isFirefox() //判断是否是Firefox
  • isHeadless() //判断是否是无头
  • url() //返回当前网址
  • source() //返回当前页面的源 HTML 代码
  • getWebDriver() //返回 WebDriver 实例(由 Selenide 自动创建或由用户设置)
  • setWebDriver(WebDriver) //告诉硒化物使用用户创建的驱动程序. 从这一刻起,用户自己负责关闭驱动程序

智能等待+断言

Selenide 将断言与等待做了集成,使用should语法会不断查找给定的条件,如果查到就返回结果

Selenium

FluentWait<By> fluentWait = new FluentWait<By>(By.tagName("TEXTAREA"));
fluentWait.pollingEvery(100, TimeUnit.MILLISECONDS);
fluentWait.withTimeout(1000, TimeUnit.MILLISECONDS);
fluentWait.until(new Predicate<By>() {
    public boolean apply(By by) {
        try {
            return browser.findElement(by).isDisplayed();
        } catch (NoSuchElementException ex) {
            return false;
        }
    }
});
assertEquals("John", browser.findElement(By.tagName("TEXTAREA")).getAttribute("value"));

Selenium

检查元素状态断言的方法:

  • should(Condition) / shouldBe(Condition) / shouldHave(Condition)
  • shouldNot(Condition) / shouldNotBe(Condition) / shouldNotHave(Condition)
//这样代码行就可以像常见的英语短语一样容易阅读 默认设置为4000 ms
$("input").shouldHave(value("John"));
$("input").should(exist);  //等待元素存在
$("input").shouldBe(visible); //等待元素可见
$("input").shouldHave(exactText("Some text"));
//复合条件
Condition clickable = and("can be clicked", visible, enabled);
$$(".button").findBy(clickable).click()
//任何条件都可以被否定:
log("Hidden or disabled items: " + $$(".item").filterBy(not(clickable)).size());
//Selenide还支持部分断言
 $("#domain-container").shouldHave(attribute("class"));
 $("#domain-container").shouldHave(attribute("class", "container"));
//支持正则模式
$("#domain-container").shouldHave(attributeMatching("class", "contain.*"));  // class="container"
 $("#domain-container").shouldHave(attributeMatching("class", ".*tainer"));
 $("#domain-container").shouldHave(attributeMatching("class", ".+tain.+"));

你也可以显示等待

  • waitUntil(Condition, milliseconds)
  • waitWhile(Condition, milliseconds)

Condition条件有如下:

  • visible | appear // e.g. $("input").shouldBe(visible) (instead of $("input").shouldBe(Condition.visible))
  • present | exist // conditions to wait for element existence in DOM (it can be still hidden)
  • hidden | disappear | not(visible)
  • readonly // e.g. $("input").shouldBe(readonly)
  • name // e.g. $("input").shouldHave(name("fname"))
  • value // e.g. $("input").shouldHave(value("John"))
  • type // e.g. $("#input").shouldHave(type("checkbox"))
  • id // e.g. $("#input").shouldHave(id("myForm"))
  • empty // e.g. $("h2").shouldBe(empty)
  • attribute(name) // e.g. $("#input").shouldHave(attribute("required"))
  • attribute(name, value) // e.g. $("#list li").shouldHave(attribute("class", "active checked"))
  • cssClass(String) // e.g. $("#list li").shouldHave(cssClass("checked"))
  • focused
  • enabled
  • disabled
  • selected
  • matchText(String regex)
  • text(String substring)
  • exactText(String wholeText)
  • textCaseSensitive(String substring)
  • exactTextCaseSensitive(String wholeText)
  • and
  • or
  • not

配置简单

这些都是可选的,支持自定义配置

Configuration.timeout //配置元素等待时间

Configuration.baseUrl //open()函数调用的基本URL可以通过编程方式配置,也可以通过系统属性“ -Dselenide.baseUrl = http:// myhost”进行配置。

Configuration.browser //使用哪个浏览器。

Configuration.browserCapabilities //浏览器功能。

Configuration.browserPosition //浏览器窗口在屏幕上的位置。

Configuration.browserSize //浏览器窗口大小。

Configuration.browserVersion //要使用的浏览器版本(对于Internet Explorer)

Configuration.clickViaJs //注意!使用此功能时,单击后自动等待WebDriver自动工作不起作用。

Configuration.downloadsFolder //用于将下载的文件存储到的文件夹。

Configuration.driverManagerEnabled //控制Selenide和WebDriverManager集成。。

Configuration.fastSetValue //如果设置为true,则使用javascript设置值,而不使用Selenium内置的“ sendKey”函数(这很慢,因为它分别发送每个字符)。

Configuration.fileDownload //定义是通过直接HTTP下载文件还是通过vie selenide嵌入式代理服务器下载文件。可以通过编程方式配置,也可以通过系统属性“ -Dselenide.fileDownload = PROXY”进行配置 默认:HTTPGET

Configuration.headless//启用以无头模式运行浏览器的功能。

Configuration.holdBrowserOpen //如果holdBrowserOpen为true,则运行测试后浏览器窗口保持打开状态。

Configuration.pageLoadStrategy //webdriver应该等到页面完全加载之后。

Configuration.pollingInterval //检查是否出现单个元素或集合元素时的时间间隔(以毫秒为单位)可以通过编程方式或通过系统属性“ -Dselenide.pollingInterval = 50”进行配置 默认值:200(毫秒)

Configuration.proxyEnabled //如果Selenide应该通过自己的代理服务器运行浏览器。

Configuration.proxyHost //Selenide代理服务器的主机。

Configuration.proxyPort //Selenide代理服务器的端口。

Configuration.remote //远程Web驱动程序的URL(在使用Selenium Grid的情况下)。

Configuration.reopenBrowserOnFail //如果Selenide消失(挂起,损坏,意外关闭),应该重新生成浏览器。

Configuration.reportsFolder //将屏幕快照存储到的文件夹。

Configuration.reportsUrl //可选:将报告发布到的CI服务器的URL。

Configuration.savePageSource //定义Selenide是否在失败的测试中保存页面源。

Configuration.screenshots //定义Selenide是否在失败的测试中拍摄屏幕截图。

Configuration.selectorMode //选择Selenide如何检索Web元素:使用默认CSS或Sizzle(CSS3)。

Configuration.startMaximized //启动时,浏览器窗口将最大化。

Configuration. timeout //如果仍然不满足条件,则以毫秒为单位的失败测试失败可以通过编程方式或通过系统属性“ -Dselenide.timeout = 10000”来配置 默认值:4000(毫秒)

Configuration.versatileSetValue //如果设置为true,则SelenideElement的'setValue'和'val'方法可以用作'selectOptionByValue','selectRadio',具体取决于元素标签定义的实际控件类型。

自动截屏

运行失败后,会自动截图保存到build\reports\tests中

当然这是可选的,你可以自定义配置保存文件夹位置,是否在失败时进行截图。

定义配置保存文件夹位置,是否在失败时进行截图。

总结

我们可以看到Selenide相比于Selenium代码简洁了很多,封装了许多功能。我在用了Selenide之后立马弃用了Selenium,我的断言库,智能等待,操作的一些封装都不用了,因为Selenide做的更好。Selenide更新也是十分活跃的,我刚看时最新更新是在昨天,如此活跃的社区,如此强大的功能,我没有理由不使用它。后续我可能会介绍如何结合PO模式,如何基于Selenide进一步封装。

官网: https://selenide.org/.

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页