Selenium api
我們把這些Selenium方法或者接口分成三類,一類是driver相關,也就是操作瀏覽器本身設置,第二類是元素相關,就是一些元素的點擊,輸入等操作,第三類是一些工具支持類,例如截圖,日志輸出,事件監聽。
一.瀏覽器本身設置
WebDriver driver = new FirefoxDriver();
點擊查看WebDriver發現是一個接口,它的備注這樣寫的:WebDriver是一個測試的主要接口,它展現了一個理想化的web瀏覽器,它主要包括三個目錄。1)控制瀏覽器本身 2)查找和選擇元素 3)調試程序,比如異常處理。
driver.get("https://www.baidu.com");
這里的get方法的作用是,在當前瀏覽器窗口,加載一個新的web頁面,是通過http get發生請求完成的。參數類型是String,一般是url。get方法就是打開一個網頁的作用。
driver.manage().window().maximize();
從Selenium的源碼文件,可以知道,manage是得到Option這類接口用的。 是在Option這個接口下面可以找到的。Option接口是這樣描述的:An interfacefor managing stuff you would do in a browser menu,所以,這些操作都是來控制瀏覽器本身。
driver.navigate().to("http://news.baidu.com/");//打開測試頁面
Navigation接口,主要包括平時瀏覽器的前進,后退,打開網址,刷新當前頁操作。
driver.quit();退出瀏覽器
Interface Alert(基於瀏覽器的彈出框)
彈出對話框(Popup dialogs)
Alert alert = driver.switchTo().alert();//焦點定位,切換到當前彈窗
alert.accept(); //確定
alert.dismiss(); //取消
alert.getText(); //獲取文本
alert.senkeys( );
二、元素相關:
web自動化測試的核心就是找到網頁元素,並相應去操作元素。
Selenium中findElement接口能支持八種方法去查找網頁元素
1.1查找元素的方法
By id
其 HTML 代碼如下:
<input id="su" class="bg s_btn" type="submit" value="百度一下"/>如要操作該按鈕,則可以通過 ID(id="su")作為查找條件獲取該對象
WebElement baiduSearch = driver.findElement(By.id("su"));
另外,還可以執行 js 的 document.getElementById 來獲取對象,腳本如下:
WebElement elementC=(WebElement) ((JavascriptExecutor) driver).executeScript("returndocument.getElementById('su')");
By name
<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新聞</a>
WebElement news= driver.findElement(By.name("tj_trnews "));
3.LinkText 和 和 PartialLinkText
LinkText 方法按鏈接的文本進行查找,PartialLinkText 方法按鏈接的文本進行模糊查找。
例如,百度首頁上的“登錄”超級鏈接
它的鏈接文本屬性為“登錄”
driver.findElement(By.linkText("登錄")).click();
driver.findElement(By.partialLinkText("登")).click();
By XPath
什么是Xpath
元素,我們說的元素之網頁元素(web element)。在網頁上面的文本輸入框,按鈕,多選,單選,標簽,和文字都叫元素,總之,凡是能在頁面顯示的對象都可以作為頁面元素對象。
元素定位, 有時候也叫Locator,一個HTML頁面元素,可以用很多方法去描述這個元素的位置。打個比方,生活中地址,一個大廈,正常的地址是 xx省xx市xx區xx街道xxx號,這個具體描述就是這個大廈的Locator。同樣的道理,一個網頁元素,也有位置,也可以通過一些手段或者表達式去 描述這個元素在頁面對應的位置。
XPath,XPath即為XML路徑語言,它是一種用來確定XML(標准通用標記語言的子集)文檔中某部分位置的語言。XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力,XPath 很快的被開發者采用來當作小型查詢語言。
Xpath基礎:
/ |
絕對路徑 |
表示從xml的根位置開始或子元素(一個層次結構) |
// |
相對路徑 |
表示不分任何層次結構的選擇元素 |
* |
通配符 |
|
[] |
條件 |
表示選擇什么條件下的元素 |
@ |
屬性 |
表示選擇屬性節點 |
and |
關系 |
表示條件的與關系 |
text() |
文本 |
表示選擇文本內容 |
要選catalog 底下的 cd 中所有 price 元素可以用:
/catalog/cd/price
注: XPath 的開頭是一個斜線(/)代表這是絕對路徑。如果開頭是兩個斜線(//)表示文件中所有符合模式的元素都會被選出來,即使是處於樹中不同的層級也會被選出來。//cd
選擇未知的元素,下面這個語法會選出/catalog/cd 的所有子元素:
/catalog/cd/*
以下的語法會選出所有 catalog 的子元素中,包含有 price 作為子元素的元素。
/catalog/*/price
以下的語法會選出有兩層父節點,叫做 price 的所有元素。
/*/*/price
以下的語法會選擇出文件中的所有元素。
//*
選擇分支
使用中括號可以選擇分支。以下的語法從 catalog 的子元素中取出第一個叫做 cd 的元素。XPath 的定義中沒有第0元素這種東西。
/catalog/cd[1]
以下語法選擇 catalog 中的最后一個 cd 元素:( XPathj 並沒有定義 first() 這種函式喔,用上例的 [1]就可以取出第一個元素。
/catalog/cd[last()]
以下語法選出含有 price 子元素的所有/catalog/cd 元素。
/catalog/cd[price]
以下語法選出 price 元素的值等於10.90的所有/catalog/cd 元素
/catalog/cd[price=10.90]
以下語法選出 price 元素的值等於10.90的所有/catalog/cd 元素 的 price 元素
/catalog/cd[price=10.90]/price
選擇一個以上的路徑
使用 Or 操作數(|)就可以選擇一個以上的路徑。例如:
/catalog/cd/title | catalog/cd/artist
選擇所有 title 以及 artist 元素
//title | //artist
選擇所有 title 以及 artist 以及 price 元素
//title | //artist | //price
選擇屬性
在 XPath 中,除了選擇元素以外,也可以選擇屬性。屬性都是以@開頭。例如選擇文件中所有叫做 country 的屬性。
//@country
選擇所有含有 country 這個屬性的 cd 元素:
//cd[@country]
以下語法選擇出含有屬性的所有 cd 元素
//cd[@*]
以下語法選擇出 country 屬性值為 UK 的 cd 元
//cd[@country='UK']
安裝firebug安裝xpath
百度搜索輸入框定位元素
打開百度首頁—— 鼠標定位到搜索輸入框——右鍵鼠標,選Inspect in FirePath—— 打開界面如下圖
xpath定位
絕對路徑定位
WebElement button = driver.findElement(By.xpath("/html/body/div/input[@value='查詢']"));
一旦頁面結構發生改變,改路徑也隨之失效,必須重新。 所以不推薦使用絕對路徑的寫法
利用元素屬性定位
("//標簽[@屬性名=屬性值]")
如果以上查找方法都無法定位到指定對象,那么可以按 XPath 進行查找。例如,百度首頁的搜索按鈕。
其 HTML 代碼如下:
<input id="su" class="bg s_btn" type="submit" value="百度一下"/>
如要操作該按鈕,則可以通過其 XPath 表達式“//input[@id='su']”作為查找條件獲取該對象,XPath 的值可以通過 firebug 組件獲取,也可以自己編寫。
driver.findElement(By.xpath("//input[@id='su']"));
層級與屬性結合
("//div[@class='m-container']/input").send_keys("username")
通過邏輯運算符定位
("//input[@id='a' and @class='su']/span/input")
1.2如何對頁面元素進行操作
輸入框(text field or textarea)
WebElement element = driver.findElement(By.id("passwd-id"));
element.sendKeys(“test”);//在輸入框中輸入內容:
element.clear(); //將輸入框清空
element.getText(); //獲取輸入框的文本內容:
單選項(Radio Button)
WebElement radio=driver.findElement(By.id("BookMode"));
radio.click(); //選擇某個單選項
radio.clear(); //清空某個單選項
radio.isSelected(); //判斷某個單選項是否已經被選擇
多選項(checkbox)
WebElement checkbox = driver.findElement(By.id("myCheckbox."));
checkbox.click();
checkbox.clear();
checkbox.isSelected();//是否可選
checkbox.isEnabled();//是否有效
按鈕(button)
WebElement btn= driver.findElement(By.id("save"));
btn.click(); //點擊按鈕
btn.isEnabled (); //判斷按鈕是否enable
表單(Form)
Form中的元素的操作和其它的元素操作一樣,對元素操作完成后對表單的提交可以:
WebElement approve = driver.findElement(By.id("approve"));
approve.click();
或
approve.submit();//只適合於表單的提交
上傳文件
上傳文件的元素操作:
WebElement adFileUpload =driver.findElement(By.id("WAP-upload"));
String filePath = "C:\test\\uploadfile\\media_ads\\test.jpg";
adFileUpload.sendKeys(filePath);
另:
isDisplayed()//是否展示,返回“true”或“false”
sendKeys()//只接收字符串,如“123”
Class Select
下拉選擇框(Select)
Select select = new Select(driver.findElement(By.id("select")));
select.selectByVisibleText(“A”);
select.selectByValue(“1”);
select.deselectAll();
select.deselectByValue(“1”);
select.deselectByVisibleText(“A”);
select.getAllSelectedOptions();
select.getFirstSelectedOption();
Selenium 代碼:
Select seList = new Select(driver.findElement(By.name("gpc")));
seList.selectByVisibleText("最近一周");
調用Java Script
Web driver對Java Script的調用是通過JavascriptExecutor來實現的,例如:
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("JS腳本");
三、工具類: