1.簡介
按宏哥計划,本文繼續介紹WebDriver關於元素定位大法,這篇介紹By ClassName。看到ID,NAME這些方法的講解,小伙伴們和童鞋們應該知道,要做好Web自動化測試,最好是需要了解一些前端的基本知識。有了前端知識,做元素定位會很輕松,同樣寫網絡爬蟲也很有幫助,話題扯遠了,回到Selenium自動化測試。tagName是DOM結構的一部分,其中頁面上的每個元素都是通過輸入標簽,按鈕標簽或錨定標簽等標簽定義的。每個標簽都具有多個屬性,例如ID,名稱,值類等。就其他定位符而言在Selenium中,我們使用了標簽的這些屬性值來定位元素。 對於Selenium中的tagName定位器,我們將僅使用標簽名稱來標識元素。
何時在Selenium中使用此tagName定位符? 好吧,在沒有屬性值(如ID,類或名稱)並且傾向於定位元素的情況下,您可能不得不依靠在Selenium中使用tagName定位器。 例如,如果您希望從表中檢索數據,則可以使用< td >
標記或< tr >
標記檢索數據。
同樣,在希望驗證鏈接數量並驗證它們是否正常工作的情況下,您可以選擇通過anchor標簽定位所有此類鏈接。
請注意:在一個簡單的基本場景中,僅通過標簽定位元素,這可能會導致識別大量值並可能導致問題。 在這種情況下,Selenium將選擇或定位與您端提供的標簽匹配的第一個標簽。 因此,如果要定位單個元素,請不要在Selenium中使用tagName定位器。
2.常用定位方法(8種)
(1)id
(2)name
(3)class name
(4)tag name(今天講解)
(5)link text
(6)partial link text
(7)xpath
(8)css selector
3.自動測試實戰
跟隨宏哥的腳步,有了前邊兩篇的經驗,想必這個應該很簡單的了吧!宏哥這里就不贅述了,沒有前菜直接上正菜。
3.1當前標簽沒有重復值
當前標簽沒有重復值,所有可以直接用find_element***定位元素,和前邊講述的都差不多。宏哥這里以博客園為例,獲取博客園的title。
3.1.1主要步驟
1、打開瀏覽器
2、通過tagname進行查找元素,findelement返回的數值沒有重復的,那就是一個。
3.1.2代碼設計
通過主要步驟把代碼都設計好了,宏哥只需要將其串起來,調試腳本即可。如下圖所示:
3.1.3參考代碼
package lessons; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; /** * @author 北京-宏哥 * * 2021年7月28日 */ public class ByTagName { public static void main(String[] args) throws Exception { // System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑 // // WebDriver driver = new ChromeDriver (); System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get("https://www.cnblogs.com/"); Thread.sleep (5000); WebElement ww = driver.findElement(By.tagName("title")); System.out.println(ww.getText()); driver.close(); } }
3.1.4運行代碼
1.運行代碼,右鍵Run AS->java Application,控制台輸出,如下圖所示:
2.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示:
3.2當前標簽沒有重復值
當前標簽存在重復則在運行的時候會找不到元素,此時需要使用find_elements***。通過tagName來搜索元素的時候,會返回多個元素. 因此需要使用findElements()。宏哥這里以博客園為例,獲取博客園的發布首頁文章的信息。在此示例中,我將展示何時要標識表中的行數,因為在運行時此信息可以是動態的,因此,我們需要事先評估行數,然后檢索或驗證信息。
3.1.1主要步驟
1、打開瀏覽器
2、通過tagname進行查找元素,findelements返回的數值可能是多個,因此放在list中,此時list中的元素類型是webelement。
3.1.2代碼設計
通過主要步驟把代碼都設計好了,宏哥只需要將其串起來,調試腳本即可。如下圖所示:
3.1.3參考代碼
package lessons; import java.util.List; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.firefox.FirefoxDriver; /** * @author 北京-宏哥 * * 2021年7月28日 */ public class ByTagName { public static void main(String[] args) throws Exception { // System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑 // // WebDriver driver = new ChromeDriver (); System.setProperty("webdriver.gecko.driver", ".\\Tools\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get("https://www.cnblogs.com/"); List<WebElement> links= driver.findElements(By.tagName( "article" )); //storing the size of the links int i= links.size(); //Printing the size of the string //System.out.println(i); for (int j=0; j<i; j++) { //Printing the links System.out.println(links.get(j).getText()); } driver.close(); } }
3.1.4運行代碼
1.運行代碼,右鍵Run AS->java Application,控制台輸出,如下圖所示:
2.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示:
4.小結
好了,今天到這里通過name定位就介紹完了,其實很簡單,在使用tagname進行定位的時候,由於一個頁面中含有的tagname數目不定,可能是0,1或者是多個,因此這時候就不能用findelement方法了,此時需要使用findelemnets。
5.拓展
1.tag name即標簽名稱,如:a、input、button、img等
- 目標
查找頁面中的a標簽
- 實現
element1 = driver. find_element_by_tag_name(“a”)
element2 = driver. find_element(by=”tag name”, value=”a”)
- 說明
當前標簽沒有重復值,所有可以直接用find_element***定位元素,如果name存在重復則在運行的時候會找不到元素,此時需要使用find_elements***,假設a存在重復值,則定位方式如下:
element3 = driver.find_elements_by_class_name(“a”) element4 = driver.find_elements(by=”class name”, value=”a”)
2.通過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()); } }