selenium元素定位大全
阿新 • • 發佈:2017-08-31
alt ddd 進行 type http find bdd 技術 其他 要做自動化,首先要了解頁面結構,要了解頁面結構,就要了解頁面元素的定位方法
在使用selenium webdriver進行元素定位時,通常使用findElement或findElements方法結合By類返回的元素句柄來定位元素。
常用的元素定位方法如下:
如何選擇 定位方法
策略是:選擇簡單,穩定的定位方法。
1. 當頁面元素有id屬性的時候, 盡量使用id來定位。 沒有的話,再選擇其他定位方法
2. cssSelector 執行速度快, 推薦使用
3. 定位超鏈接的時候,可以考慮linkText或partialLinkText:但是要註意的是 , 文本經常發生改變, 所以不推薦用
4. xpath 功能最強悍。 但是執行速度慢,因為需要查找整個頁面元素, 所以盡量少用。 實在沒有辦法的時候,才使用xpath
部分定位詳解,因為其他都比較簡單
1、By.tagName()
通過tagName來搜索元素的時候,會返回多個元素. 因此需要使用findElements()
WebDriver driver = new FirefoxDriver();
driver.get("http://www.cnblogs.com");
List<WebElement> buttons = driver.findElements(By.tagName("div"));
System.out.println("Button:" + buttons.size());
註意: 如果使用tagName, 要註意很多HTML元素的tagName是相同的,
比如單選框,復選框, 文本框,密碼框.這些元素標簽都是input. 此時單靠tagName無法精確獲取我們想要的元素, 還需要結合type屬性,才能過濾出我們要的元素
WebDriver driver = new FirefoxDriver();
driver.get("http://www.cnblogs.com");
List<WebElement> buttons = driver.findElements(By.tagName("input"));
for (WebElement webElement : buttons) {
if (webElement.getAttribute("type").equals("text")) {
System.out.println("input text is :" + webElement.getText());
}
}
2、Xpath定位
2.1.什麽是xpath:xpath 是XML Path的簡稱, 由於HTML文檔本身就是一個標準的XML頁面,所以我們可以使用Xpath 的用法來定位頁面元素。
2.2.xpath定位的缺點 xpath 這種定位方式, webdriver會將整個頁面的所有元素進行掃描以定位我們所需要的元素, 這是個非常費時的操作, 如果腳本中大量使用xpath做元素定位的話, 腳本的執行速度可能會稍慢
例如 testXpath.html 代碼如下
<html>
<head><title>Test Xpath</title></head>
<body>
<div id="div1">
<input name="div1input"></input>
<a href="http://www.sogou.com">搜狗搜索</a>
<img alt="div1-img1" src="http://www.sogou.com/images/logo/new/sogou.png" href="http://www.sogou.com">搜狗圖片</img>
<input type="button" value="查詢"></input>
</div>
<br />
<div name="div2">
<input name="div2iniput" /></input>
<a href="http://www.baidu.com">百度搜索</a>
<img alt="div2-img2" src="http://www.baidu.comn/img/bdlogo.png" href="http:/www.baidu.com">百度圖片</img>
</div>
</body>
</html>
絕對路徑定位方式
在被測試網頁中, 查找第一個div標簽中的按鈕
XPath的表達式:/html/body/div/input[@value="查詢"]
WebElement button = driver.findElement(By.xpath("/html/body/div/input[@value=‘查詢‘]"));
絕對路徑的缺點
1. 一旦頁面結構發生改變,改路徑也隨之失效,必須重新。 所以不推薦使用絕對路徑的寫法
絕對路徑和相對路徑的區別
絕對路徑 以 "/" 開頭, 讓xpath 從文檔的根節點開始解析
相對路徑 以"//" 開頭, 讓xpath 從文檔的任何元素節點開始解析
相對路徑定位方式
在被測試網頁中,查找第一個div標簽中的按鈕
XPath的表達式://input[@value="查詢"]
WebElement button = driver.findElement(By.xpath("//input[@value=‘查詢‘]"));
3、表格定位
舉例1:
driver.navigate().to("http://www.w3school.com.cn/html/html_tables.asp");
//獲取所有的tr集合
List<WebElement> rows=driver.findElements(By.className("dataintable"));
//驗證表格的行數
// assertEquals(11, rows.size());
//打印出所有單元格的數據
for(WebElement row : rows){
//等到當前tr裏的td集合
List<WebElement> cols=driver.findElements(By.tagName("td"));
for(WebElement col : cols){
System.out.println(col.getText()); //得到td裏面的文本
}
System.out.println();
}
舉例2:
思路:層級定位,先定位table,在定位tr,在定位td
String url="table的地址";
driver.get(url);
String str="第一行第一列";
String str1="第三行第一列";
WebElement Table = driver.findElement(By.tagName("table"));
//java裏打印元素類型 Sydtem.out.print(driver.findElement(By.tagName("table")).getClass());
//table有那麽多行,定位在哪一行呢?--》默認都是第一行
// 所以就不能用 Table.findElement(By.tagName("tr")),findElement是定位單一的一個元素的方法,定位一組用findElements
// Table.findElement(By.tagName("tr"));//這種方式取到的是一個數組,就不是一個對象了,所以以下方法是正確的
List < WebElement> rows = Table.findElements(By.tagName("tr"));
for( WebElement row : rows){
List <WebElement> tds = row.findElements(By.tagName("td"));
for( WebElement td : tds){
// System.out.print(td.getText()+"\n"); //取出所有元素
String value=td.getText();
// if(value==str){ 為什麽不能用= =,因為value是一個對象
if(value.equals(str) || value.equal(str1)){
System.out.print(value+"\n");
}else{
System.out.print("error"+"\n");
}
}
}
selenium元素定位大全