7.1 常見定位對象元素的方法css
常見定位對象元素的方法html
在使用selenium webdriver進行元素定位時,一般使用findElement或findElements方法結合By類返回的元素句柄來定位元素。其中By類的經常使用定位方式共八種,現分別介紹以下:java
By.id()程序員
id頁面元素的id通常是惟一的,使用id定位效率較高,而且定位精確web
使用方法以下:windows
public class SearchButtonById {瀏覽器
public static void main(String[] args){安全
WebDriver driver = new FirefoxDriver();服務器
driver.get("http://www.forexample.com");app
WebElement searchBox = driver.findElement(By.id("gbqfba"));
searchBox.click();
}
}
常見定位對象元素的方法
By.name()
使用元素的name 和元素的id定位的益處相似
使用方法以下:
public class SearchButtonByName {
public static void main(String[] args){
WebDriver driver = new FirefoxDriver();
driver.get("http://www.forexample.com");
WebElement searchBox = driver.findElement(By.name("btnK"));
searchBox.click();
}
}
元素沒有id或者name,怎麼辦?建議和相關開發人員溝通增長id或者name,或者使用下列方法:
By.xpath()
這個方法是很是強大的元素查找方式,使用這種方法幾乎能夠定位到頁面上的任意元素。在正式開始使用XPath進行定位前,咱們先了解下什麼是XPath。XPath是XML Path的簡稱,因爲HTML文檔自己就是一個標準的XML頁面,因此咱們可使用XPath的語法來定位頁面元素。
使用方法以下:
driver.findElement(By.xpath(「//a[contains(@href, ‘logout’)]」));
By.cssSelector()
cssSelector這種元素定位方式跟xpath比較相似,但執行速度較快,並且各類瀏覽器對它的支持都至關到位,因此功能也是蠻強大的。
使用方法以下:
WebElement password = driver.findElement(By.cssSelector("#J_login_form>dl>dt>input[id=’ J_password’]"));
By.tagName()
該方法能夠經過元素的標籤名稱來查找元素。該方法跟以前兩個方法的區別是,這個方法搜索到的元素一般不止一個,因此通常建議結合使用findElements方法來使用。好比咱們如今要查找頁面上有多少個button,就能夠用button這個tagName來進行查找。
使用方法以下:
List<WebElement> buttons = driver.findElements(By.tagName("button"));
By.className()
className屬性是利用元素的css樣式表所引用的僞類名稱來進行元素查找的方法。對於任何HTML頁面的元素來講,通常程序員或頁面設計師會給元素直接賦予一個樣式屬性或者利用css文件裏的僞類來定義元素樣式,使元素在頁面上顯示時可以更加美觀。若是此時咱們要經過className屬性來查找該button並操做它的話,就可使用className屬性了。
使用方法以下:
WebElement searchBox = driver.findElement(By.className("buttonStyle"));
By.linkText()
這個方法比較直接,即經過超文本連接上的文字信息來定位元素,這種方式通常專門用於定位頁面上的超文本連接。
<a href="/intl/en/about.html">About Google</a>
使用方法以下:
WebElement aboutLink = driver.findElement(By.linkText("About Google"));
By.partialLinkText()
這個方法是上一個方法的擴展。當你不能準確知道超連接上的文本信息或者只想經過一些關鍵字進行匹配時,可使用這個方法來經過部分連接文字進行匹配。
使用方法以下:
WebElement aboutLink = driver.findElement(By.partialLinkText("About"));
7.2 切換窗口、Frame和其餘對象識別方法
在web應用中,經常會碰見點擊某個連接會彈出一個新的窗口,或者是相互關聯的web應用 ,要去操做新窗口中的元素,就須要主機切換到新窗口進行操做,否則會在以前的窗口找元素,這樣會致使找不到元素或者腳本報錯,WebDriver 提供了switchTo().window()方法能夠實如今不一樣的窗口之間切換。
主要用到以下方法:
getWindowHandle():得到當前窗口句柄
getWindowHandles():返回的全部窗口的句柄到當前會話
switchTo().window():用於切換到相應的窗口
switchTo().frame()默認的是取表單的ID和name屬性。若是沒有id和name ,可經過Xpath路徑定位。
對錶單操做完成以後能夠經過driver.switchTo().defaultContent() 跳出表單。
例如:在web應用中,前臺網頁的設計通常會用到iframe/frame表單嵌套頁面的應用。簡單的就是一個頁面籤嵌套多個HEML/JSP文件。selenium webdriver 只能在同一頁面識別定位元素,能夠理解成只能識別當前所在位置的頁面上的元素。對於不一樣的iframe/frame表單中的元素是沒法直接定位的。須要結合switchTo().frame()方法切換到指定的frame/iframe中。
在web應用中,頁面有時會彈出Alert彈出框,讓用戶確認信息,處理這種狀況,也須要switchTo彈窗,而後操做。
點擊ok
driver.switchTo().alert().accept();
點擊Cancel
driver.switchTo().alert().dismiss();
Selenium實現拖拽功能
1. 找到要拖拽的頁面元素-源(source)。
2. 找到要釋放的頁面元素-目標(target), 頁面顯示的這個元素多是個坑, 可是在頁面代碼中他就是一個元素。
3. 藉助(new Actions(driver)).DragAnddrop( source, target).perform(), 完成元素拖放操做。
Selenium實現拖拽功能
public static Boolean dragAndDrop(WebDriver driver, By source, By target){
try{
Actions action = new Actions(driver);
WebDriverWait wait = new WebDriverWait(driver, 60);
WebElement elementSource = wait.until(ExpectedConditions.presenceOfElementLocated(source));
WebElement elementTarget = wait.until(ExpectedConditions.presenceOfElementLocated(target));
action.dragAndDrop(elementSource, elementTarget).perform();
Sleeper.sleepTight(5);
return true;
}
catch(Exception e)
{
System.out.println(e.getClass().getName() + " " + e.getMessage());
return false;
}
}
Selenium實現上傳文件功能
普通上傳:普通的附件上傳是將本地文件的路徑做爲一個值放在input 標籤中,經過form 表單將這個值提交給服務器。能夠經過sendKeys("文件路徑")直接上傳。
插件上傳:通常是指基於Flash、JavaScript 或Ajax 等技術所實現的上傳功能。
插件上傳,可使用AutoIt 實現上傳 編寫腳本 來實現。AutoIt 的安裝以及使用須要參考AutoIt 使用手冊等相關文檔。selenium 經過AutoIt 來操做window窗口的操做實質是經過java代碼來調用AutoIt 生成的腳本.exe文件。
經過Java調用的exe 程序並不在Java 的可控範圍內。換句話說,exe 執行多長時間,執行是否出錯,Java 程序都沒法得知。
如下是在AutoIt 編輯器中編輯的操做文件上傳窗口的代碼:
ControlFocus("打開","","Edit1」);
識別windows窗口
WinWait("[CLASS:#32770]","",10);
窗口等待十秒
ControlSetText("打開", "", "Edit1", "C:\Users\happy\Desktop\FileUpload.html」);
想輸入框中輸入須要上傳的地址
Sleep(2000)
ControlClick("打開", "","Button1");
點擊[打開】按鈕
如下是java實現的代碼。
File file = new File("C:\\Users\\happy\\Desktop\\FileUpload.html");
// 用java來實現文件讀取功 \
driver.get(file.getAbsolutePath());
driver.findElement(By.name("uploadFile")).click();
// 點擊選擇文件按鈕
Thread.sleep(3000);
// 設置等待3秒
Runtime exe = Runtime.getRuntime();
// Java 的Runtime 模塊的getruntime.exec()方法能夠調用exe 程序並執行。
try {
String str = "E://upload.exe";
exe.exec(str);
// 運行指定位置的.exe文件
} catch (IOException e) {
System.out.println("Error to run the exe");
e.printStackTrace();
}
Selenium實現鼠標、鍵盤功能
get()
driver.get("http://www.baidu.com")
打開一個網頁
sendKeys()
driver.findElement(By.id("pwdInput")).sendKeys("password");
模擬鍵盤輸入動做
-clear()
driver.findElement(By.id("pwdInput")).clear();
清除文本輸入框中的內容
-click()
driver.findElement(By.id("loginBtn")).click();
鼠標點擊事件
-contextClick()
Actions action = new Actions(driver); action.contextClick(driver.findElement(By.id("su"))).perform();
鼠標右鍵點擊指定的元素
-clickAndHold()
Actions action = new Actions(driver); action.clickAndHold(driver.findElement(By.linkText("設置"))).perform();
鼠標懸停
-moveToElement()
Actions action = new Actions(driver);
action.moveToElement(driver.findElement(By.linkText("設置"))).perform();
鼠標移動
-doubleClick()
Actions action = new Actions(driver); action.doubleClick(driver.findElement(By.name("element"))).perform();
鼠標雙擊
Selenium對瀏覽器的操做
-driver.manage().window().maximize();
窗口最大化
-driver.forward()/driver.back()
前進/後退
-driver.window_handles
返回當前瀏覽器的全部窗口
-driver.quit()/driver.close()
關閉瀏覽器
Selenium實現時間等待
隱性等待
顯式等待
implicitlyWait:
識別對象時的超時時間。過了這個時間若是對象還沒找到的話就會拋出NoSuchElement 異常
setScriptTimeout:
異步腳本的超時時間。webdriver能夠異步執行腳本,這個是設置異步執行腳本腳本 返回結果的超時時間
pageLoadTimeout:
頁面加載時的超時時間。由於webdriver會等頁面加載完畢在進行後面的操做,因此若是頁面在這個超時時間內沒有加載完成,那麼 webdriver 就會拋出異常。
//頁面加載超時時間設置爲 5s:
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS); driver.get("http://www.baidu.com/");
//定位對象時給 10s 的時間, 若是 10s 內還定位不到則拋出異常: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.findElement(By.id("kw33")).sendKeys("selenium");
//異步腳本的超時時間設置成 3s
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
sleep 休眠方法:
當執行到 sleep()方法時會固定的休眠所設置的時長(這裏以毫秒爲單位);而後再繼續執行。
driver.get("http://www.baidu.com/");
Thread.sleep(2000);
Selenium處理Windows事件
Selenium 處理安全對話框 (windows security dialog)用安裝使用autoit 來代替
public void autoitHandleWin(String title,String userName,String pwd){
AutoItX x=new AutoItX();
if(x.winWaitActive(title,"",20)){
if(x.winExists(title)){
x.sleep(500);
x.ControlSetText(title,"",Edit1,userName);
x.ControlSetText(title,"",Edit1,pwd);
x.ControlClick(title,"",Button);
}
}
}
7.3 如何處理網頁出現異常的狀況
如何處理網頁出現異常的狀況?
1.捕獲異常,將異常寫入log日誌
2.截圖記錄當時網頁
3.加入重試機制