Selenium 元素定位

Selenium webdriver是徹底模擬用戶在對瀏覽器進行操做,全部用戶都是在頁面進行的單擊、雙擊、輸入、滾動等操做,而webdriver也是同樣,因此須要咱們指定元素讓webdriver進行單擊、雙擊、輸入等操做,因此元素定位是UI自動化測試的前提條件。css

selenium總共有八種定位方法 html

By.id()           ---->>     driver.findElement(By.id("id"));  經過id定位
By.name()     ---->>     driver.findElement(By.name("name"));  經過name 定位
By.xpath()     ---->>     driver.findElement(By.xpath("xpath定位表達式"));  經過xpath定位
By.className()     ---->>   driver.findElement(By.className("className"));  經過className定位
By.cssSelector()    ---->>    driver.findElement(By.cssSelector("CSS表達式"));  經過CSS 定位
By.linkText()           ---->>    driver.findElement(By.linkText("連接所有文字"));  經過linkText
By.tagName()        ---->>    driver.findElement(By.tagName("標籤名"));  經過tagName
By.partialLinkText()      ---->>   driver.findElement(By.partialLinkText("連接部分文字"));  經過匹到的部分linkTextjquery

其中xpath定位使用比較多,而xpath有4種定位方式web

第1種方法:經過絕對路徑或相對路徑作定位(推薦使用相對路徑定位)
By.xpath("html/body/div/div/div/div/div/form/input[@id=’kw’]")
By.xpath("//input[@id='kw']")chrome

其中」//「表示在全部層級中進行查找,建議使用相對路徑進行定位,由於相對路徑相對的簡潔些,無論頁面發生一下什麼變化,只要id值爲kw的input元素還在就能夠定位到,這樣能夠下降代碼維護成本。瀏覽器

第2種方法:經過元素索引定位
By.xpath("//input[4]")
表示xpath在定位查找元素時,選擇第4個tagname爲input的元素即爲所需元素,遇到頁面HTML層級比較複雜的頁面不建議使用索引號定位。測試

第3種方法:使用xpath屬性定位
By.xpath("//input[@id='kw']")
表示id爲kw的input元素ui

By.xpath("//input[@type='text' and @name='kw']")
表示type爲text而且name爲kw的input元素spa

第4種方法:使用部分屬性值匹配(最強大的方法),適合動態屬性的定位code

By.xpath("//input[starts-with(@id,'auto')
表示id屬性以auto開始的ipunt元素

By.xpath("//input[ends-with(@id,'test')
表示id屬性以test結束的ipunt元素

By.xpath("//input[contains(@id,'abc')]")
表示id屬性包含abc的ipunt元素

 

js與jQuery定位(需熟悉js與jQuery選擇器)

在實際的自動化實施過程當中,有些時候上述的這些定位方式都不能操做到元素,這個時候就可使用js與jQuery來定位,專治定位難的問題。

在使用js定位時,能夠在瀏覽器的Console中輸入js定位代碼(jQuery同理,輸入jQuery代碼),以下圖:

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

/**
 * js與jQuery定位
 */
public class Demo {
    WebDriver driver;
    
    @BeforeMethod
    public void beforeMethod(){
        System.setProperty("webdriver.chrome.driver", "e:\\chromedriver.exe");
        driver = new ChromeDriver();
    }
    
    @AfterMethod
    public void afterMethod(){
        driver.quit();
    }
    
    //js定位
    @Test
    public void jsDemo(){
        driver.get("http://www.baidu.com");
        JavascriptExecutor js= (JavascriptExecutor) driver;
        //利用js代碼鍵入搜索關鍵字
        js.executeScript("document.getElementById(\"kw\").value=\"測試\"");
        //利用js代碼取出關鍵字 
        String keyword = (String) js.executeScript("var input = document.getElementById(\"kw\").value; return input");
        System.out.println("keyword: "+keyword);    
        driver.findElement(By.id("su")).click();
    }
    
    //jQuery定位
    @Test
    public void jqueryDemo(){
        driver.get("http://www.baidu.com");
        JavascriptExecutor js  = (JavascriptExecutor) driver;
        js.executeScript("$('#kw').val(\"測試\")");
        String keyword = (String) js.executeScript("var input = $('#kw').val();return input");
        System.out.println("keyword: "+keyword);
        driver.findElement(By.id("su")).click();
    }
}

 

webdriver在多層iframe中定位元素

如今不少IT系統的後臺頁面嵌套了iframe,iframe 中其實是嵌入了另外一個頁面,而 webdriver 每次只能在一個頁面識別,所以須要用 switch_to.frame 方法去獲取 iframe 中嵌入的頁面,對那個頁面裏的元素進行定位。

1.iFrame有ID 或者 name的狀況
//進入id="frame1"的frame中,定位id="div1"的div和id="input1"的輸入框。
dr.switchTo().frame("frame1");
dr.findElement(By.id("div1"));
dr.findElement(By.id("input1"))

2.若是一個iFrame既沒有id,也沒有name,通用狀況
// 定位frame位置,並選取frame
WebElement frame=driver.findElement(By.xpath( "/html/body/div[2]/div[8]/div[2]/div[3]/div/div[2]/div/iframe" ));
driver.switchTo().frame(frame);

3.跳出iFrame
//跳出frame,進入default content;從新定位id="id1"的div
dr.switchTo().defaultContent();
dr.findElement(By.id("id1"))

定位過程當中,也能夠在瀏覽器的Console中輸入js代碼 【document.getElementsByTagName("iframe")】,查看iframe

相關文章
相關標籤/搜索