Java?Selenide?簡介與用法
Selenide 介紹

什么是selenium
一套軟件工具,用來支持不同的自動化測試方法
開源軟件:可以根據(jù)需要來增加重構(gòu)工具的某些功能
跨平臺:linux , windows mac
核心功能就是可以在多個瀏覽器上進(jìn)行自動化測試
支持多種編程語言
目前已經(jīng)被google , 百度, 騰訊等公司廣泛使用
能夠?qū)崿F(xiàn)類似商業(yè)工具的大部分功能,并且還實現(xiàn)了商業(yè)工具不能支持的功能
建議大家整體學(xué)習(xí)整套工具, 將來好選擇適合自己測試目的的測試工具。
Selenide 是對 Selenium 的一個封裝,其語法更加簡單。其優(yōu)點如下:
- 代碼簡單、易讀
- 內(nèi)置隱式等待(無需考慮元素的等待時間)
- 用例運行完后自動關(guān)閉瀏覽器
- 自動對失敗用例截圖
- 由于是對 Selenium 的封裝,所以可以和 Selenium 一起使用
- ...
Selenide 的團(tuán)隊自詡它是一個測試工具而不是一個測試框架,因為它只是 Webdriver 的一個封裝(目前只有 Java 版本),其底層的實現(xiàn)還是 Webdriver。所以他們認(rèn)為并沒有偉大到開發(fā)了一個測試框架,而僅僅是個測試工具(很謙虛的說)。
所以一切 Webdriver 能做的,Selenide 都能做。Webdriver 做不到的,也別指望 Selenide 能做到。
就像團(tuán)隊人員說的“Selenide is just a wrapper”,如果你不想使用 Selenide 了,或者 Selenide 滿足不了你的需要,你大可以通過以下方式獲取一個 Webdriver,直接操作 Webdriver 的 API 。
driver = WebDriverRunner.getWebDriver();
所以如果有小伙伴擔(dān)心這個新興的工具沒有強大到滿足你的項目需求怎么辦?大可以放心,最壞的情況也就是直接用 Webdriver 去做就好了。
官方快速入門
Maven 依賴:
不同版本的 Selenide 所兼容的 selenium 版本不同(如 Selenide 5 對應(yīng) selenium 4)。
不同版本的 Selenide 所默認(rèn)支持的瀏覽器版本范圍也不同。
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>selenide</artifactId>
<version>5.25.1</version>
</dependency>測試代碼:
@Test
public void testBaiduSearch() {
open("https://www.baidu.com");
$(By.name("username")).setValue("johny");
$("#submit").click();
$(".success-message").shouldHave(text("Hello, Johny!"));
}前面說了 Selenide 致力于封裝更簡單好用的 API,所以開啟和關(guān)閉瀏覽器這些東西它都幫你做好了。
Selenide 默認(rèn)使用 Firefox 瀏覽器,如果你要使用其他瀏覽器可以手動設(shè)置:
Configuration.browser="chrome";
// 如果默認(rèn)chrome版本不兼容,可以在環(huán)境變量中設(shè)置 chrome 瀏覽器的路徑
System.setProperty("webdriver.chrome.driver", Constant.getChromeDriverPath());
// 手動設(shè)置 chrome 瀏覽器的路徑
System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");元素定位
Selenide 使用$符號定位一個元素,使用 IDEA 時只要輸入“$(by”就可以通過代碼提示來找到我們想要的方法。如下圖:

// $ 符號默認(rèn)參數(shù)是 CSS 定位表達(dá)式,返回 SelenideElement 類的對象,SelenideElement 繼承 WebElement,該對象表示頁面上 CSS 選擇器找到的第一個元素
$(String cssSelector)
// 輸出的元素: "<option value=livemail.ru checked=true selected:true>@livemail.ru</option>"
System.out.println($("#customerContainer"));
// 通過元素 id 定位
$("#id")
$(byId("id"))
// 通過 class 定位
$(".className")
$(byClassName(".className"))
// 通過 name 定位
$(byName("name"))
// 通過 text 定位。如果使用 selenium 的話只能用小 path 的寫法,如 driver.findElementByXpath(“//*[text()=‘Sign in']”)
$(byText("Sign in"))
// 通過Xpath定位
$(byXpath("http://*[text()='Sign in']"))
// 通過元素的屬性定位
$(byAttribute("placeholder", "房源編號"))
// $$ 用于定位一組元素(返回 ElementsCollection 類型的元素集合),且可以再在集合中繼續(xù)定位元素
$$("#search-results a").findBy(text("selenide.org"))元素操作
元素操作:
click() // 點擊 doubleClick() // 雙擊 contextClick() hover() setValue(String)/val(String) // 文本輸入 pressEnter() // 回車鍵 pressEscape() pressTab() selectRadio(String value) selectOption(String) append(String) dragAndDropTo(String)
獲取元素狀態(tài)和屬性值:
getValue()/val() data() attr(String) text() // 返回頁面上的可見文本 innerText() // 返回 DOM 中元素的文本 getSelectedOption() getSelectedText() getSelectedValue() isDisplayed() // 如果元素被隱藏(不可見)或者 DOM 中不存在元素,則返回 false exists() // 如果 DOM 中存在元素,則返回 true
瀏覽器操作
// 打開瀏覽器(如果尚未打開)并加載URL
open(String URL);
// 切換瀏覽器窗口
switchTo().window(1);
// 刷新
refresh();
// 線程等待
sleep();
// 操作 alert
confirm(); // 確定 alert
confirm("exceptionText"); // 判斷alert的文字是否是期望的那個,如果是則接收 alert
dismiss(); // 取消 alert斷言
Selenide 通過 should 來進(jìn)行斷言,相當(dāng)于 Assert 。
示例如下:
$("input").should(exist); // 驗證元素應(yīng)該存在
$("input").shouldBe(visible); // 驗證元素應(yīng)該可見
$("input").shouldHave(exactText("Some text")); // 驗證元素的 text 是否包含 Some text
$("input").shouldHave(value("John")); // 驗證元素的 value 屬性等于 John
$("#input").shouldHave(id("myForm")); // 驗證元素的 id 屬性等于 myForm
$("#btn-Search").shouldHave(text("搜索")); // 驗證元素是否包含“搜索”文本
$("#btn-Search").shouldNotHave(text("搜索")); // 驗證元素不包含“搜索”文本
$("#customerContainer").should(matchText("profile")); // 使用正則表達(dá)式:是否包含“profile”文本還可以使用斷言來做顯示等待,等待的狀態(tài)(visible、enabled、text(“some text”))是否滿足,直到超時達(dá)到的值(默認(rèn)設(shè)置為 4000 毫秒),例如:
$("#submit").shouldBe(enabled).click();還可以明確設(shè)置超時:
waitUntil(條件, 毫秒) waitWhile(條件, 毫秒)
常用配置
// 把 webDriver 傳給 selenide
setWebDriver(driver);
// 獲取當(dāng)前 driver
WebDriverRunner.getWebDriver();
// 設(shè)置瀏覽器運行完不關(guān)閉
Configuration.holdBrowserOpen = true;
// 修改報告默認(rèn)生成路徑
Configuration.reportsFolder = "target/reports/test"+Configuration.browser;
// 設(shè)置遠(yuǎn)程服務(wù)器(如selenium Grid Hub)
Configuration.remote = "http://xxxxxxx";
// selenide 默認(rèn)使用 Firefox 瀏覽器,可以手動設(shè)置使用其他瀏覽器
System.setProperty("webdriver.chrome.driver", chromeDriverPath);
Configuration.browser = "chrome";
// selenide 自動對于失敗用例進(jìn)行截圖,默認(rèn)保存在 build/report 里面Selenide 和 Webdriver 對比
創(chuàng)建 webdriver 的方式:
// webdriver
DesiredCapabilities desiredCapabilities = DesiredCapabilities.htmlUnit();
desiredCapabilities.setCapability(HtmlUnitDriver.INVALIDSELECTIONERROR, true);
desiredCapabilities.setCapability(HtmlUnitDriver.INVALIDXPATHERROR, false);
desiredCapabilities.setJavascriptEnabled(true);
WebDriver driver = new HtmlUnitDriver(desiredCapabilities);
// selenide
open("/my-application/login");Selenide 直接在open 這個 API 里就啟動瀏覽器了,當(dāng)測試結(jié)束時就會關(guān)閉瀏覽器。
查詢頁面元素:
// webdriver
WebElement customer = driver.findElement(By.id("customerContainer"));
// selenide
WebElement customer = $(By.id("customerContainer"));這方面倒沒有什么特別簡化的,但是 selenide 有其他更靈活的方式搜尋控件,例如 byText、byValue 等等,這些在 webdriver 中除非用 xpath,否則是做不到的。
// selenide
WebElement customer = $(byText("Customer profile"));
WebElement temp = $(byValue("不使用")).click();
WebElement temp1 = $(byAttribute("data-name",“test name”)).click();再看看下面一個,如果返回多個元素,取其中一個:
// webdriver
driver.findElements(By.tagName("li")).get(5);
// selenide
$("li", 5); // 取一個元素:取所有標(biāo)簽為li的元素中的第5個
$$("#multirowTable tr").filterBy(text("Norris")); // 取一個集合:取特定的集合后再去搜尋text為期望值的元素斷言控件:
// webdriver
assertEquals("Customer profile", driver.findElement(By.id("customerContainer")).getText());
// selenide
$("#customerContainer").shouldHave(text("Customer profile"));Selenide 提供一系列 should 標(biāo)簽幫我們做斷言的工作,而且有一批text()的這種選擇器來幫助我們斷言各種類型。上面的例子就是斷言控件是否有期望的 text 。
Selenide 專門有一個 condition 包,里面有各種各樣的 condition,這些 condition 就是 should 標(biāo)簽的參數(shù)。上面的例子 text 就是一個 condition,其他的還有 id、value、attribute、readonly 等等。
等待控件:
有些時候為了增加穩(wěn)定性,我們需要增加等待一個控件出現(xiàn)的機制。因為控件可能不是立刻出現(xiàn)的,或者說等待一個控件的某個屬性變成一個特定值。
// webdriver
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"));
// selenide
$("TEXTAREA").shouldHave(value("John"));可以看到 Selenide 一個 should 的 API 搞定了。它默認(rèn) 4s 超時,4s 內(nèi)會循環(huán) check 控件的 value 是否變成了期望值。同樣的還有 text、attribute 等選擇器。
正則表達(dá)式:
// webdriver
WebElement element = driver.findElement(By.id("customerContainer"));
assertTrue(Pattern.compile(".*profile.*", DOTALL).matcher(element.getText()).matches());
// selenide
$("#customerContainer").should(matchText("profile"));關(guān)于 alert :
// webdriver
try {
Alert alert = checkAlertMessage(expectedConfirmationText);
alert.accept();
} catch (UnsupportedOperationException alertIsNotSupportedInHtmlUnit) {
return;
}
Thread.sleep(200); // sometimes it will fail
// selenide
confirm("Are you sure to delete your profile?");
// 或者
dismiss("Are you sure to delete your profile?");到此這篇關(guān)于Java Selenide 介紹與使用的文章就介紹到這了,更多相關(guān)Java Selenide 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot使用logback文件查看錯誤日志過程詳解
這篇文章主要介紹了springboot使用logback文件查看錯誤日志過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09

