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()); } }