最近使用selenium架構實作業務前端的UI自動化,在使用selenium時,有一些心得想要和大家分享一下。
Selenium是一款用于web應用程式測試的工具,常用來實作穩定業務的UI自動化。這裡,不想對其發展曆史做介紹,也不想用官方語言去描述。簡單的一句話總結其運作的基本原理:适配于對應浏覽器的webdriver驅動解析自動化執行腳本,按其規定的方式操作浏覽器。
到這裡,我們也大緻了解selenium是幹什麼用的,那麼接下來直接切入主題,和大家分享我在做UI自動化的時候總結出的一些小知識點,我想這些小知識點對于想要快速入門selenium的同學或者初級使用者多少有點幫助。
1.如何搭建環境?
使用selenium的環境具體需要:jdk+浏覽器驅動+浏覽器。由于本業務選擇使用java語言實作ui自動化,是以需要用到jdk。目前selenium支援的主流的浏覽器有chrome,ie,firefox等,需要注意的是,下載下傳好浏覽器之後,必須下載下傳适應版本的浏覽器驅動方可操作浏覽器。
2.哪些方式用來定位元素?
目前最常用定位元素有以下7種方式:
2.1>根據元素的name屬性進行定位
webDriver.findElement(By.name("phrase"));
2.2>根據文本連結進行定位
webDriver.findElement(By.linkText("發表"));
2.3>根據元素的id屬性進行定位
webDriver.findElement(By.id("title"));
2.4>根據元素的class屬性進行定位
webDriver.findElement(By.className("note-editable"));
2.5>根據css定位元素,css屬性定位能夠靈活地選擇控件的任意屬性。
webDriver.findElement(By.cssSelector("li:nth-child(2)")).click();
2.6>根據元素的标簽名進行定位
webDriver.findElement(By.tagName("phrase"));
2.7>根據xpath的絕對路徑或者相對路徑進行定位,這種定位方式最精準,最可靠。
webdriver.findElement(By.xpath("//img[@alt='div1-img1']"));
3.如何控制時間并有效的定位元素?
使用selenium最常見的問題就是找不到元素,而找不到元素的絕大部分原因就是在一定時間内,元素沒有加載出來導緻。是以,控制好時間對于有效的定位元素很有幫助。selenium中常見的時間控制手段有三種:
3.1>使用線程控制,如:Thread.sleep(ms)。該種控制方式效果好,但是不夠靈活,即使元素已經定位到,也需要耗完指定的時間。
3.2>隐式等待控制,如:webDriver.manage().timeouts.implicitlyWait(10,TimeUnit.SECONDS)。隐式等待也叫全局等待,webDriver執行個體的所有findElement都會有該設定時長的等待,作用域大,但靈活性不夠。
3.3>顯示等待控制,如:
WebDriverWait wait=new WebDriverWait(driver, 10);
WebElement wl = wait.until(new ExpectedCondition<WebElement>() {
@Override
public WebElement apply(WebDriver d) {
return d.findElement(By.cssSelector(".red_box"));
}
});
顯示等待作用于單個元素上,明确的要等到某個元素的出現,除非在規定的時間之内沒找到,那麼就抛出異常。顯然,該方式使用更加靈活,而且顯示等待隻需找到元素即可運作程式的下一步,比之線程,能夠節省時間。
4.如何确定元素是否存在?
一般有兩種手段:
4.1>使用try catch捕獲元素定位不到抛出的異常。可見下圖:

4.2>使用selenium api自帶函數。見下圖:
5.如何切換視窗?
ui自動化操作常涉及頁面跳轉等操作,很多時候會打開新的視窗,這時,webdriver執行個體會發生改變,如果想繼續準确定位元素,這就需要切換視窗。切換可以通過switchTo()函數來控制,可見如下執行個體(适用于隻有兩個視窗的其他視窗切換):
6.如何使用無頁面模式?
由于本項目ui自動化需要部署到centos伺服器上,是以需要使用無頁面模式。目前,有chrome,firefox兩種浏覽器支援無頁面模式,那麼,如何使用無頁面模式了?其實,隻需要在生成webdriver執行個體時,指定無頁面模式屬性即可。chromeOptions.addArguments("headless");//無界面參數
7.如何滑動頁面?
有時,為了使得需要點選的元素出現在視圖内,通常需要滑動頁面,而在selenium中可以通過控制執行腳本來實作。((JavascriptExecutor) webDriver).executeScript("window.scrollBy(0, 7000)");
8.如何實作無驗證碼登陸?
通過模式識别等方案去實作驗證碼擷取進而登入網站的方式不夠成熟可靠。目前較為可靠的一種方式,利用已登入網站的cookie來替代無驗證碼登入,具體實作方式可參考下圖:
9.如何截取全圖?
有時,需要将運作中的圖檔截出來,用以直覺的定位業務的問題,可以使用如下方式:
10.如何關閉視窗?
使用完webdriver後,需要關閉視窗。關于關閉視窗,有兩種形式:
10.1> webdriver.close():用來關閉目前視窗。
10.2> webdriver.quit():用來退出驅動并關閉所有關聯的視窗。
11.如何實作頁面重新整理?
對于頁面重新整理操作不妨使用下面幾種方法:
webdriver.navigate().refresh();
webdriver.get(driver.getCurrentUrl());
webdriver.navigate().to(driver.getCurrentUrl());
webdriver.executeScript("history.go(0)");