一、Selenium測試-常用頁面處理
1、概述
UI自動化測試(GUI界面層):UI層是用戶使用產品的入口,所有功能通過這一層提供給用戶,測試工作大多集中在這一層,常見的測試工具有UFT、Robot Framework、Selenium、Appium等,今天我們的主角就是selenium。
2、Selenium常見頁面操作
相信對於每個做過ui(gui頁面測試)的人都知道,界面自動化測試的核心就是定位元素,本篇的重點就是和大家探討下,如何處理測試過程中常見的頁面元素操作,主要分為【text field or textarea輸入框】、【Button按鈕】、【Radio Button單選框】、【Checkbox復選框】、【Select下拉框】、【左右選擇框】、【form表單】、【Upload File上傳文件】、【Drag andDrop拖拉】、【Mouse MoveOn鼠標懸停】、【彈窗alert/confirm/prompt】、【windows彈窗】、【table表格】、【富文本框】
3、selnium實戰操作
a、【Button按鈕】、【Radio Button單選框】、【Checkbox復選框】【form表單】
對於按鈕、單選多選框的操作是一樣的,都需要先定位到元素,在進行點擊操作即可,只是復選框要定位多個選項后在點擊。
/*Button*/
WebElement Button = driver.findElementByid();
Button.click();
/*RadioButton*/
WebElement radiobutton = driver.findElement(By.id("sexID2"));
radiobutton.click();
/*Checkbox*/
WebElement RadioC = driver.findElement(By.id("u1"));
WebElement RadioX = driver.findElement(By.id("u2"));
RadioC.click();
RadioX.click();
表單同button
b、【Select下拉框】
下拉框是一個很常見的頁面元素,和其他定位方式不同的是,需要引入Select類,並初始化下拉框元素對象,然后用select的方法進行取值
Select select = new Select(driver.findElement(By.id("areaID")));//select 初始化下拉框對象,然后進行下面的取值
select.selectByIndex(index);
select.selectByValue("tianjin");
select.selectByVisibleText("北市");
備注:select有三種取值方式,如索引:selectByIndex、值:selectByValue、本文:selectByVisibleText,其中最常用的是selectByVisibleText
c、【左右選擇框】
Select select= new Select(driver.findElement(By.id("languages"))); //先處理選擇框
select.selectByVisibleText(“English”);
WebElement moveButton=driver.findElement(By.id("addButton")); //再處理向右移動的按鈕
moveButton.click();
d、【Upload File上傳文件】
WebElement fileload = driver.findElement(By.name("file"));
fileload.sendKeys("E:\\上傳文件.txt");
e、【Mouse MoveOn鼠標懸停】
懸停操作主要針對於比如趕集網、百度首頁的更多按鈕,因為“更多”里面的菜單無法直接選中,應用還比較廣泛,也需要引入新的類型Action,並對driver進行初始化。如下:
WebElement moreButton = driver.findElement(By.name("tj_briicon"));
Actions action = new Actions(driver);
action.moveToElement(moreButton).perform();
f、【Drag andDrop拖拉】
暫時還沒研究特別明白,暫時不做介紹
g、【彈窗alert/confirm/prompt】
彈框是一個比較常見的事物,而且種類也特別多,主要是alert警告窗口、confirm確認窗口、prompt提示窗口三種,至於alert和confirm的區別,alert點擊確定后就關不了提示窗口,而confirm你點擊確定和取消會彈出不同的窗口或者不同的處理,他們和windows窗口的最大區別是F12開發者工具無法打開。如果可以打開就需要視為window彈窗處理。三種提示窗口如下圖:
alert
·
confirm
prompt
下面介紹下以上三種提示框代碼操作
//處理alert confirm
driver.findElement(By.id("alert")).click(); //點擊會觸發alert的元素,比如按鈕
Alert alert = driver.switchTo().alert();
String text = alert.getText(); //獲取alert上的文本
System.out.println(text);
//alert.accept();
alert.dismiss(); //關閉alert
//處理prompt
driver.findElement(By.id("alert")).click(); //點擊會觸發alert的元素,比如按鈕
Alert alert = driver.switchTo().alert();
String text = alert.getText(); //獲取alert上的文本
prompt.sendKeys("ok!!!!"); //輸入值,如果支持輸入的話,這是唯一區別
//alert.accept();
alert.dismiss(); //關閉alert
h、【windows彈窗】
在講解彈窗之前,我們要知道一個概念,那就是句柄,其實大家可以把句柄理解為瀏覽器窗口的一個屬性,我們每次打開瀏覽器都會被賦予一個唯一句柄屬性,這樣操作系統就知道該操作那個頁面了,就相當於人的身份證一樣,或者理解為程序里面的指針,這樣每次我們操作瀏覽器窗口的時候,我們只需要將句柄切換到待操作窗口就可以正確的獲取元素和操作元素了,話不多說,看下面的代碼
String currentwindow = driver.getWindowHandle();//獲取當前頁面句柄
那么如果打開了多個窗口,就需要用如下函數獲取所有句柄
Set <String> handles = driver.getWindowHandles();
獲取句柄有多中方式,set集合迭代器Iterator、for循環 我將用兩種方式分別實現
Interator <string> it = handles.iterator();
while(it.hasNext()){
String handle = it.next();
if (currentwindow.equals(handle)){
//此處根據自己的條件靈活的判斷。
continue;
}
WebDriver window = driver.switchTo().window(handle);//切換 注意,這里要根據你判斷的條件來確定你切換的位置。請看for循環
}
for (String handle : handles){
WebDriver window = driver.switchTo().window(handle);
if (window.getTitle().equals("百度一下,你就知道")) {
System.out.println("title,url = " + window.getTitle() + ","+ window.getCurrentUrl());
}
}
i、【table表格】
表格的處理一般有2中處理方式,一種是xpath定位,另一種是層級定位,下面我將針對這2種形式進行逐一講解
xpath:
public class Table{
private String locator;
private WebDriver driver;
/ 表格初始化,入參為driver和table的定位,使用xpath相對路徑的方式定位table */
public Table(WebDriver dr, String locator) {
this.driver = dr;
this.locator = locator;
}
/* 根據行列坐標,取單元格里的內容,標題和操作區從1開始計算,@param row @param col*/
public String getCellText(int row, int col){
//拼接單元格的路徑
String xpath = locator + "/tr[" + row +"]/td[" + col + "]";
WebElement cell = driver.findElement(By.xpath(xpath));
return cell.getText();
}
}
// 層級定位表格的方式,坐標從0開始
public class Table {
private WebDriver driver;
public Table(WebDriver driver) {
this.driver = driver;
}
/*從一個table的單元格中得到文本值.先定位table的值,在根據table對象定位子元素的位置*/
public String getCellText(By by, int row, int col) {
// 得到table元素對象,by是By.**("")的封裝 ,selnium自帶
WebElement table = driver.findElement(by);
// 得到table表中所有行對象,並得到所要查詢的行對象。
List<WebElement> rows = table.findElements(By.tagName("tr"));
WebElement theRow = rows.get(row);
// 調用getCell方法得到對應的列對象,然后得到要查詢的文本。
String text = getCell(theRow, col).getText();
return text;
}
private WebElement getCell(WebElement Row, int col) {
List<WebElement> cells;
WebElement target = null;
// 列里面有"<th>"、"<td>"兩種標簽,所以分開處理。
if (Row.findElements(By.tagName("th")).size() > 0) {
cells = Row.findElements(By.tagName("th"));
target = cells.get(col);
}
if (Row.findElements(By.tagName("td")).size() > 0) {
cells = Row.findElements(By.tagName("td"));
target = cells.get(col);
}
return target;
}
}
j、【富文本框】
文本框可用js也可以用selenium常規定位方式,主要看文本框是否好定位,有些文本框無法特別移動按鈕沒有id、name等屬性值,這時候可以用js定位,有的很容定位,則用元素定位方式既可。
/*js處理富文本編輯框*/
driver.switchTo().frame("ueditor_0");
//定位到富文本輸入框所在的frame
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.body.innerHTML='ABCDEFG'"); //通過js賦值進去
/*常規處理富文本編輯框*/
driver.switch_to.frame('iframe')//切換ifranme
driver.findElement(By.id("element"));
driver.findElement(By.id("textarea")).sendKeys("hello world");
WebElement moveButton = ddriver.findElement(By.id("element"));
moveButton.click();
l、iframe的處理
driver.switchTo().frame(Int index); //傳入參數為frame的序號,從0開始
driver.switchTo().frame(String nameOrId); //傳入參數為frame的ID或者Name屬性
driver.switchTo().parentFrame(); //切換回父級 –高版本selenium可用
driver.switchTo().defaultContent(); //切換回默認
備注:查找元素必須在對應的iframe或者frame中查找,否則是找不到的。如果用int index來切換,那么iframe和frame是統一計數。
4、selenium重要的方法
driver.getTitle();//獲取標題
driver.getCurrentUrl();//獲取當前頁面url
driver.getPageSource();//獲取頁面資源
driver.switchTo().window(currentwindow);//跳轉到currentwindow句柄頁面
driver.manage().window().maximize();//最大化
driver.manage().addCookie(Cookie cookie);//添加刪除cookie
driver.switchTo().alert();切換到alert窗口
總結:以上就是selenium基本元素操作的全部內容,希望對剛開始學習的同學有幫助,學習自動化最重要的是實踐,還有就是融匯貫通,在不同的場景下,運用不同的方法組合,舉一個“栗子”,是我在測試中遇見的個大坑,有一個項目,我點擊創建用戶后,新增頁面無法用F12開發者工具定位,又不是alert,最終我采用的方法:第一步切換到新增頁面句柄,獲取並輸出當前頁面的driver.getCurrentUrl();然后手工在另外一個瀏覽器中打開,這時候用開發者工具F12定位的時候,發現可以了。希望能給剛學自動化UI測試的同學們一點啟發,大牛請自行飄過,后續我將編寫一些在操作瀏覽器的時候遇見的坑,敬請期待,有過有不對的地方,也請各位大牛提出,歡迎評論