第4章 Selenium2-java WebDriver API (一)


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();
}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM