《手把手教你》系列技巧篇(十一)-java+ selenium自動化測試-元素定位大法之By tag name(詳細教程)

巨集哥發表於2021-07-29

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

 

相關文章