Java?Selenide?簡(jiǎn)介與用法
Selenide 介紹
什么是selenium
一套軟件工具,用來(lái)支持不同的自動(dòng)化測(cè)試方法
開(kāi)源軟件:可以根據(jù)需要來(lái)增加重構(gòu)工具的某些功能
跨平臺(tái):linux , windows mac
核心功能就是可以在多個(gè)瀏覽器上進(jìn)行自動(dòng)化測(cè)試
支持多種編程語(yǔ)言
目前已經(jīng)被google , 百度, 騰訊等公司廣泛使用
能夠?qū)崿F(xiàn)類(lèi)似商業(yè)工具的大部分功能,并且還實(shí)現(xiàn)了商業(yè)工具不能支持的功能
建議大家整體學(xué)習(xí)整套工具, 將來(lái)好選擇適合自己測(cè)試目的的測(cè)試工具。
Selenide 是對(duì) Selenium 的一個(gè)封裝,其語(yǔ)法更加簡(jiǎn)單。其優(yōu)點(diǎn)如下:
- 代碼簡(jiǎn)單、易讀
- 內(nèi)置隱式等待(無(wú)需考慮元素的等待時(shí)間)
- 用例運(yùn)行完后自動(dòng)關(guān)閉瀏覽器
- 自動(dòng)對(duì)失敗用例截圖
- 由于是對(duì) Selenium 的封裝,所以可以和 Selenium 一起使用
- ...
Selenide 的團(tuán)隊(duì)自詡它是一個(gè)測(cè)試工具而不是一個(gè)測(cè)試框架,因?yàn)樗皇?Webdriver 的一個(gè)封裝(目前只有 Java 版本),其底層的實(shí)現(xiàn)還是 Webdriver。所以他們認(rèn)為并沒(méi)有偉大到開(kāi)發(fā)了一個(gè)測(cè)試框架,而僅僅是個(gè)測(cè)試工具(很謙虛的說(shuō))。
所以一切 Webdriver 能做的,Selenide 都能做。Webdriver 做不到的,也別指望 Selenide 能做到。
就像團(tuán)隊(duì)人員說(shuō)的“Selenide is just a wrapper”,如果你不想使用 Selenide 了,或者 Selenide 滿(mǎn)足不了你的需要,你大可以通過(guò)以下方式獲取一個(gè) Webdriver,直接操作 Webdriver 的 API 。
driver = WebDriverRunner.getWebDriver();
所以如果有小伙伴擔(dān)心這個(gè)新興的工具沒(méi)有強(qiáng)大到滿(mǎn)足你的項(xiàng)目需求怎么辦?大可以放心,最壞的情況也就是直接用 Webdriver 去做就好了。
官方快速入門(mén)
Maven 依賴(lài):
不同版本的 Selenide 所兼容的 selenium 版本不同(如 Selenide 5 對(duì)應(yīng) selenium 4)。
不同版本的 Selenide 所默認(rèn)支持的瀏覽器版本范圍也不同。
<dependency> <groupId>com.codeborne</groupId> <artifactId>selenide</artifactId> <version>5.25.1</version> </dependency>
測(cè)試代碼:
@Test public void testBaiduSearch() { open("https://www.baidu.com"); $(By.name("username")).setValue("johny"); $("#submit").click(); $(".success-message").shouldHave(text("Hello, Johny!")); }
前面說(shuō)了 Selenide 致力于封裝更簡(jiǎn)單好用的 API,所以開(kāi)啟和關(guān)閉瀏覽器這些東西它都幫你做好了。
Selenide 默認(rèn)使用 Firefox 瀏覽器,如果你要使用其他瀏覽器可以手動(dòng)設(shè)置:
Configuration.browser="chrome"; // 如果默認(rèn)chrome版本不兼容,可以在環(huán)境變量中設(shè)置 chrome 瀏覽器的路徑 System.setProperty("webdriver.chrome.driver", Constant.getChromeDriverPath()); // 手動(dòng)設(shè)置 chrome 瀏覽器的路徑 System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
元素定位
Selenide 使用$
符號(hào)定位一個(gè)元素,使用 IDEA 時(shí)只要輸入“$(by”就可以通過(guò)代碼提示來(lái)找到我們想要的方法。如下圖:
// $ 符號(hào)默認(rèn)參數(shù)是 CSS 定位表達(dá)式,返回 SelenideElement 類(lèi)的對(duì)象,SelenideElement 繼承 WebElement,該對(duì)象表示頁(yè)面上 CSS 選擇器找到的第一個(gè)元素 $(String cssSelector) // 輸出的元素: "<option value=livemail.ru checked=true selected:true>@livemail.ru</option>" System.out.println($("#customerContainer")); // 通過(guò)元素 id 定位 $("#id") $(byId("id")) // 通過(guò) class 定位 $(".className") $(byClassName(".className")) // 通過(guò) name 定位 $(byName("name")) // 通過(guò) text 定位。如果使用 selenium 的話(huà)只能用小 path 的寫(xiě)法,如 driver.findElementByXpath(“//*[text()=‘Sign in']”) $(byText("Sign in")) // 通過(guò)Xpath定位 $(byXpath("http://*[text()='Sign in']")) // 通過(guò)元素的屬性定位 $(byAttribute("placeholder", "房源編號(hào)")) // $$ 用于定位一組元素(返回 ElementsCollection 類(lèi)型的元素集合),且可以再在集合中繼續(xù)定位元素 $$("#search-results a").findBy(text("selenide.org"))
元素操作
元素操作:
click() // 點(diǎn)擊 doubleClick() // 雙擊 contextClick() hover() setValue(String)/val(String) // 文本輸入 pressEnter() // 回車(chē)鍵 pressEscape() pressTab() selectRadio(String value) selectOption(String) append(String) dragAndDropTo(String)
獲取元素狀態(tài)和屬性值:
getValue()/val() data() attr(String) text() // 返回頁(yè)面上的可見(jiàn)文本 innerText() // 返回 DOM 中元素的文本 getSelectedOption() getSelectedText() getSelectedValue() isDisplayed() // 如果元素被隱藏(不可見(jiàn))或者 DOM 中不存在元素,則返回 false exists() // 如果 DOM 中存在元素,則返回 true
瀏覽器操作
// 打開(kāi)瀏覽器(如果尚未打開(kāi))并加載URL open(String URL); // 切換瀏覽器窗口 switchTo().window(1); // 刷新 refresh(); // 線(xiàn)程等待 sleep(); // 操作 alert confirm(); // 確定 alert confirm("exceptionText"); // 判斷alert的文字是否是期望的那個(gè),如果是則接收 alert dismiss(); // 取消 alert
斷言
Selenide 通過(guò) should 來(lái)進(jìn)行斷言,相當(dāng)于 Assert 。
示例如下:
$("input").should(exist); // 驗(yàn)證元素應(yīng)該存在 $("input").shouldBe(visible); // 驗(yàn)證元素應(yīng)該可見(jiàn) $("input").shouldHave(exactText("Some text")); // 驗(yàn)證元素的 text 是否包含 Some text $("input").shouldHave(value("John")); // 驗(yàn)證元素的 value 屬性等于 John $("#input").shouldHave(id("myForm")); // 驗(yàn)證元素的 id 屬性等于 myForm $("#btn-Search").shouldHave(text("搜索")); // 驗(yàn)證元素是否包含“搜索”文本 $("#btn-Search").shouldNotHave(text("搜索")); // 驗(yàn)證元素不包含“搜索”文本 $("#customerContainer").should(matchText("profile")); // 使用正則表達(dá)式:是否包含“profile”文本
還可以使用斷言來(lái)做顯示等待,等待的狀態(tài)(visible、enabled、text(“some text”))是否滿(mǎn)足,直到超時(shí)達(dá)到的值(默認(rèn)設(shè)置為 4000 毫秒),例如:
$("#submit").shouldBe(enabled).click();
還可以明確設(shè)置超時(shí):
waitUntil(條件, 毫秒) waitWhile(條件, 毫秒)
常用配置
// 把 webDriver 傳給 selenide setWebDriver(driver); // 獲取當(dāng)前 driver WebDriverRunner.getWebDriver(); // 設(shè)置瀏覽器運(yùn)行完不關(guān)閉 Configuration.holdBrowserOpen = true; // 修改報(bào)告默認(rèn)生成路徑 Configuration.reportsFolder = "target/reports/test"+Configuration.browser; // 設(shè)置遠(yuǎn)程服務(wù)器(如selenium Grid Hub) Configuration.remote = "http://xxxxxxx"; // selenide 默認(rèn)使用 Firefox 瀏覽器,可以手動(dòng)設(shè)置使用其他瀏覽器 System.setProperty("webdriver.chrome.driver", chromeDriverPath); Configuration.browser = "chrome"; // selenide 自動(dòng)對(duì)于失敗用例進(jìn)行截圖,默認(rèn)保存在 build/report 里面
Selenide 和 Webdriver 對(duì)比
創(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 這個(gè) API 里就啟動(dòng)瀏覽器了,當(dāng)測(cè)試結(jié)束時(shí)就會(huì)關(guān)閉瀏覽器。
查詢(xún)頁(yè)面元素:
// webdriver WebElement customer = driver.findElement(By.id("customerContainer")); // selenide WebElement customer = $(By.id("customerContainer"));
這方面倒沒(méi)有什么特別簡(jiǎn)化的,但是 selenide 有其他更靈活的方式搜尋控件,例如 byText、byValue 等等,這些在 webdriver 中除非用 xpath,否則是做不到的。
// selenide WebElement customer = $(byText("Customer profile")); WebElement temp = $(byValue("不使用")).click(); WebElement temp1 = $(byAttribute("data-name",“test name”)).click();
再看看下面一個(gè),如果返回多個(gè)元素,取其中一個(gè):
// webdriver driver.findElements(By.tagName("li")).get(5); // selenide $("li", 5); // 取一個(gè)元素:取所有標(biāo)簽為li的元素中的第5個(gè) $$("#multirowTable tr").filterBy(text("Norris")); // 取一個(gè)集合:取特定的集合后再去搜尋text為期望值的元素
斷言控件:
// webdriver assertEquals("Customer profile", driver.findElement(By.id("customerContainer")).getText()); // selenide $("#customerContainer").shouldHave(text("Customer profile"));
Selenide 提供一系列 should 標(biāo)簽幫我們做斷言的工作,而且有一批text()的這種選擇器來(lái)幫助我們斷言各種類(lèi)型。上面的例子就是斷言控件是否有期望的 text 。
Selenide 專(zhuān)門(mén)有一個(gè) condition 包,里面有各種各樣的 condition,這些 condition 就是 should 標(biāo)簽的參數(shù)。上面的例子 text 就是一個(gè) condition,其他的還有 id、value、attribute、readonly 等等。
等待控件:
有些時(shí)候?yàn)榱嗽黾臃€(wěn)定性,我們需要增加等待一個(gè)控件出現(xiàn)的機(jī)制。因?yàn)榭丶赡懿皇橇⒖坛霈F(xiàn)的,或者說(shuō)等待一個(gè)控件的某個(gè)屬性變成一個(gè)特定值。
// 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 一個(gè) should 的 API 搞定了。它默認(rèn) 4s 超時(shí),4s 內(nèi)會(huì)循環(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go Java算法之K個(gè)重復(fù)字符最長(zhǎng)子串詳解
這篇文章主要為大家介紹了Go Java算法之K個(gè)重復(fù)字符最長(zhǎng)子串詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08java向下轉(zhuǎn)型基礎(chǔ)知識(shí)點(diǎn)及實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于java向下轉(zhuǎn)型基礎(chǔ)知識(shí)點(diǎn)及實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-05-05Java簡(jiǎn)單實(shí)現(xiàn)猜數(shù)字游戲附C語(yǔ)言版本
猜數(shù)字是興起于英國(guó)的益智類(lèi)小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來(lái)用Java和C語(yǔ)言分別把這個(gè)小游戲?qū)懗鰜?lái)練練手2021-11-11學(xué)習(xí)在一臺(tái)新電腦上配置JAVA開(kāi)發(fā)環(huán)境
本文主要介紹了如何在一臺(tái)新電腦上配置JAVA開(kāi)發(fā)環(huán)境,每一個(gè)步驟都有對(duì)應(yīng)的截圖和文字說(shuō)明,需要的朋友可以參考下2015-07-07java實(shí)現(xiàn)求兩個(gè)字符串最長(zhǎng)公共子串的方法
這篇文章主要介紹了java實(shí)現(xiàn)求兩個(gè)字符串最長(zhǎng)公共子串的方法,是一道華為OJ上的一道題目,涉及Java針對(duì)字符串的遍歷、轉(zhuǎn)換及流程控制等技巧,需要的朋友可以參考下2015-12-12