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


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM