4.1 從定位元素開始
WebDriver提供了八種元素定位方: 在Java語言中對應的定位方法:
·id findElement(By.id())
·name findElement(By.name())
·class name findElement(By.className())
·tag name findElement(By.tagName())
·link text findElement(By.linkText())
·partial link text findElement(By.partialLinkText())
·xpath findElement(By.xpath())
·css selector findElement(By.cssSeletor())
id定位:name定位,class定位都是通過他們的屬性值來的。
link定位:專門用來定位文本鏈接。eg:<a class="mnav" name="tj_trnews" href="http://news.baidu.com">新聞</a> 對應的link定位 findElement(By.linkText("新聞"))。
partial link定位:parial link定位是對link定位的一種補充,有些文本鏈接會比較長,這個時候我們可以取文本鏈接的一部分定位,只要這一部分信息可以唯一地標識這個鏈接。eg:<a class="mnav" name="tj_trnews" href="http://news.baidu.com">這是一個很長很長的文本鏈接</a> 對應的partial link定位 findElement(By.partialLinkText("一個很長的")) 或 findElement(By.partialLinkText("文本鏈接"))。
xpath定位:最簡單的找到元素的位置的方法就是打開FireBug。
CSS定位:<span class="sp">
<input id="abc" name="def" class="ghi" type="text" maxlength='100' />
</span>
通過class屬性定位:findElement(By.cssSelector(".ghi"));
通過id屬性定位:findElement(By.cssSelector("#abc"));
通過標簽名定位:findElement(By.cssSelector("input"));
通過父子關系定位: findElement(By.cssSelector("span > input"));
通過屬性定位:findElement(By.cssSelector("input[maxlength='100']"));
XPath與CSS的類似功能的簡單對例如下表所示
package com.cy.selenium; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.interactions.Actions; import bsh.commands.dir; public class Test01 { public static void main(String[] args) { System.out.println("start selenium"); WebDriver driver=new FirefoxDriver();// 用WebDriver new Firefox瀏覽器的驅動給變量driver,相當於driver拿到了Firefox瀏覽器的控制權。 driver.manage().window().maximize(); driver.get("http://www.awbeci.com/"); driver.findElement(By.xpath(".//*[@id='navbar-collapse-01']/ul[2]/li[2]/button")).click(); driver.findElement(By.id("username")).sendKeys("SmileCy"); driver.findElement(By.id("password")).sendKeys("1314520"); driver.findElement(By.linkText("登錄")).click(); driver.findElement(By.xpath(".//*[@id='main-container']/div[1]/div[2]/div/div[2]/div/a[3]/span")).click(); // 回車鍵查詢 driver.findElement(By.cssSelector(".form-control")).sendKeys("軟件測試學"); new Actions(driver).sendKeys(Keys.ENTER).perform();// 按回車鍵 // 后退 driver.navigate().back(); // 刷新 driver.navigate().refresh(); // 關閉瀏覽器 driver.close(); } }
4.2 控制瀏覽器
4.2.1 控制瀏覽器窗口大小
driver.manage().window().setSize(new Dimension(400, 500));
4.2.2 控制瀏覽器后退、前進
WebDriver也提供了對應的back()和forward()方法來模擬后退和前進按鈕
// 后退 driver.navigate().back(); // 刷新 driver.navigate().refresh();
4.2.3 模擬瀏覽器刷新
driver.navigate().refresh();
4.3 簡單元素操作
·clear() 清除文本。 ·sendKeys(*value) 模擬按鍵輸入。 ·click() 單擊元素。
4.3.2 WebElement接口常用方法
submit() submit()方法用於提交表單
getSize() 返回元素的尺寸。
getText() 獲取元素的文本。
getAttribute(name) 獲得屬性值。
isDisplayed() 設置該元素是否用戶可見。
4.4 鼠標事件
Actions 類提供了鼠標操作的常用方法:
· contextClick() 右擊
· clickAndHold() 鼠標點擊並控制
· doubleClick() 雙擊
· dragAndDrop() 拖動
· release() 釋放鼠標
· perform() 執行所有Actions中存儲的行為
鼠標右擊操作。
導入提供鼠標操作的ActionChains 類
Actions(driver)
調用Actions()類,將瀏覽器驅動driver作為參數傳入。
contexClick(xxx)
contextClick()方法用於模擬鼠標右鍵操作,在調用時需要指定元素定位。
perform() 執行所有ActionChains中存儲的行為,可以理解成是對整個操作的提交動作。
action.contextClick(driver.findElement(By.className("cnisdisd"))).perform();
鼠標懸停。clickAndHold();
action1.clickAndHold(driver.findElement(By.linkText("設置"))).perform();
鼠標雙擊操作。
doubleClick()方法用於模擬鼠標雙擊操作。
action1.doubleClick(driver.findElement(By.className(""))).perform();
鼠標拖放操作。
drag_and_drop(source, target)在源元素上按下鼠標左鍵,然后移動到目標元素上釋放。
·source:鼠標拖動的源元素。
·target:鼠標釋放的目標元素。
WebElement source=driver.findElement(By.className("element")); WebElement target=driver.findElement(By.className("element")); action1.dragAndDrop(source, target).perform();
釋放鼠標
release()方法用於釋放鼠標事件。
action1.release().perform();
4.5 鍵盤事件
使用鍵盤按鍵方法前需要先導入keys類。
以下為常用的鍵盤操作:
sendKeys(Keys.BACK_SPACE) 刪除鍵(BackSpace)
sendKeys(Keys.SPACE) 空格鍵(Space)
sendKeys(Keys.TAB) 制表鍵(Tab)
sendKeys(Keys.ESCAPE) 回退鍵(Esc)
sendKeys(Keys.ENTER) 回車鍵(Enter)
sendKeys(Keys.CONTROL,'a') 全選(Ctrl+A)
sendKeys(Keys.CONTROL,'c') 復制(Ctrl+C)
sendKeys(Keys.CONTROL,'x') 剪切(Ctrl+X)
sendKeys(Keys.CONTROL,'v') 粘貼(Ctrl+V)
sendKeys(Keys.F1) 鍵盤F1
……
sendKeys(Keys.F12) 鍵盤F12
package com.cy.selenium; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class Test02 { public static void main(String[] args) { WebDriver driver=new FirefoxDriver(); driver.manage().window().maximize(); driver.get("http://www.baidu.com/"); WebElement input =driver.findElement(By.id("kw")); // 輸入內容 input.sendKeys("seleniumm"); // 刪除多余的m input.sendKeys(Keys.BACK_SPACE); // 輸入空格+教程 input.sendKeys(Keys.SPACE); input.sendKeys("教程"); // ctrl+a input.sendKeys(Keys.CONTROL,"a"); // ctrl+x input.sendKeys(Keys.CONTROL,"x"); // ctrl+v input.sendKeys(Keys.CONTROL,"v"); // 通過回車鍵 查詢 input.sendKeys(Keys.ENTER); driver.close(); } }
4.6 獲得驗證信息
getTitle():用於獲得當前頁面的title。
getCurrentUrl() :用戶獲得當前頁面的URL。
4.7 設置元素等待
4.7.1 timeouts方法
WebDriver提供了幾種方法來等待元素。
·implicitlyWait。識別對象時的超時時間。過了這個時間如果對象還沒找到的話就會拋出NoSuchElement異常。
·setScriptTimeout。異步腳本的超時時間。WebDriver可以異步執行腳本,這個是設置異步執行腳本腳本返回結果的超時時間。
·pageLoadTimeout。頁面加載時的超時時間。因為WebDriver會等頁面加載完畢再進行后面的操作,所以如果頁面超過設置時間依然沒有加載完成,那么WebDriver就會拋出異常
4.7.2 sleep休眠方法
Thread.sleep()方法
當執行到sleep()方法時會固定的休眠所設置的時長(這里以毫秒為單位);然后再繼續執行。
注意,這里的Thread.sleep()方法不能直接使用,必須加上異常的處理。
throws關鍵字通常被應用在聲明方法時,用來指定可能拋出的異常。
package com.cy.selenium; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; public class Wait { public static void main(String[] args) { WebDriver driver=new FirefoxDriver(); driver.manage().window().maximize(); //頁面加載超時時間為5s driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS); driver.get("http://www.baidu.com/"); //定位對象時間5s,還沒訂到位置報異常 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.findElement(By.id("kww")).sendKeys("selenium"); // Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"id","selector":"kww"} //異步腳本的超時時間為5s driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS); // Thread.sleep 需要異常處理 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } driver.close(); } }