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