策略 | 語法 | 語法 | 描述 |
---|---|---|---|
By id | driver.findElement(By.id()) | driver.findElements(By.id()) | 通過id屬性定位元素 |
By name | driver.findElement(By.name()) | driver.findElements(By.name()) | 通過name屬性定位元素 |
By class name | driver.findElement(By.className()) | driver.findElements(By.className()) | 通過class屬性定位元素 |
By tag name | driver.findElement(By.tagName()) | driver.findElements(By.tagName()) | 通過HTML標簽名定位元素 |
By link text | driver.findElement(By.linkText()) | driver.findElements(By.linkText()) | 通過鏈接內容定位元素 |
By partial link text | driver.findElement(By.partialLinkText()) | driver.findElements(By.partialLinkText()) | 通過部分鏈接內容定位元素 |
By css | driver.findElement(By.cssSelector()) | driver.findElements(By.cssSelector()) | 通過css選擇器定位元素 |
By xpath | driver.findElement(By.Xpath()) | driver.findElements(By.Xpath()) | 通過xpath定位元素 |
findElement:
1. By id
使用id,name,class屬性是定位元素的首選方法。其中,用元素的id是最首選的方法,是最快速的策略。
當發生下列情況時,無法使用id屬性:
- 不是所有的頁面元素都擁有id屬性
- id屬性的值是動態生成的
2. findElement()方法定位元素時,會查詢整個DOM,然后返回第一個匹配的元素
3. WebElement類可支持查詢子類元素。假設頁面上有一些重復的元素,它們有不同的父元素。我們可以先定位其父元素,然后定位其子元素,方法如下:
WebElement father = driver.findElement(By.id("father")); WebElement son = father.findElement(By.linkText("xxx"));
也可以將他們縮寫成一行:
1 WebElement son = driver.findElement(By.id("father")).findElement(BylinkText("xxx"));
4. NoSuchElementFoundException
findElement()和findElements()方法找不到相應的元素時,會拋出該異常。
findElements:
Selenium WebDriver的findElements()方法,可以得到指定規則的集合,適用於需要在一組相似的元素上進行操作的情況。
例:驗證百度首頁導航鏈接的數量,並打印出它們的超鏈接地址
實現代碼:
1 import java.util.List; 2 3 import org.openqa.selenium.By; 4 import org.openqa.selenium.WebDriver; 5 import org.openqa.selenium.WebElement; 6 import org.openqa.selenium.chrome.ChromeDriver; 7 import org.testng.annotations.Test; 8 9 import com.thoughtworks.selenium.SeleneseTestNgHelper; 10 11 public class FindElements { 12 13 @Test 14 public void test(){ 15 System.setProperty("webdriver.chrome.driver", "chromedriver.exe"); 16 WebDriver driver = new ChromeDriver(); 17 driver.get("http://www.baidu.com"); 18 List<WebElement> links = driver.findElements(By.cssSelector("#u1 a")); 19 //獲取集合中元素的總數量並轉為String格式(下方assertEquals方法參數格式要求) 20 String size = String.valueOf(links.size()); 21 //String size = Integer.toString(links.size()); 22 //String size = links.size()+""; 23 //驗證鏈接數量 24 SeleneseTestNgHelper.assertEquals("8", size); 25 26 //打印href屬性 27 //通過for循環獲得list中的所有元素,再調用getAttribute()方法得到元素的屬性 28 for(int i=0; i<links.size();i++){ 29 System.out.println(links.get(i).getAttribute("href")); 30 } 31 driver.quit(); 32 } 33 }
運行結果: