欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Selenium Webdriver元素定位的八種常用方式(小結(jié))

 更新時間:2021年01月13日 10:08:27   作者:技術(shù)更俗一點  
這篇文章主要介紹了Selenium Webdriver元素定位的八種常用方式(小結(jié)),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在使用selenium webdriver進行元素定位時,通常使用findElement或findElements方法結(jié)合By類返回的元素句柄來定位元素。其中By類的常用定位方式共八種,現(xiàn)分別介紹如下。

1. By.name()

假設(shè)我們要測試的頁面源碼如下:

<button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Google Search</span></button>

當(dāng)我們要用name屬性來引用這個button并點擊它時,代碼如下:

public class SearchButtonByName {
    public static void main(String[] args){
        WebDriver driver = new FirefoxDriver();
        driver.get("http://www.forexample.com");
        WebElement searchBox = driver.findElement(By.name("btnK"));
        searchBox.click();
    }
}

2. By.id()

頁面源碼如下:

 <button id="gbqfba" aria-label="Google Search" name="btnK" class="gbqfba"><span id="gbqfsa">Google Search</span></button>

要引用該button并點擊它時,代碼如下:

public class SearchButtonById {

    public static void main(String[] args){

      WebDriver driver = new FirefoxDriver();

      driver.get("http://www.forexample.com");

      WebElement searchBox = driver.findElement(By.id("gbqfba"));

      searchBox.click();

    }

}

3. By.tagName()

該方法可以通過元素的標(biāo)簽名稱來查找元素。該方法跟之前兩個方法的區(qū)別是,這個方法搜索到的元素通常不止一個,所以一般建議結(jié)合使用findElements方法來使用。比如我們現(xiàn)在要查找頁面上有多少個button,就可以用button這個tagName來進行查找,代碼如下:

public class SearchPageByTagName{

   public static void main(String[] args){

      WebDriver driver = new FirefoxDriver();
      driver.get("http://www.forexample.com");
      List<WebElement> buttons = driver.findElements(By.tagName("button"));

      System.out.println(buttons.size()); //打印出button的個數(shù)

  }

}

另外,在使用tagName方法進行定位時,還有一個地方需要注意的是,通常有些HTML元素的tagName是相同的,如下圖(1)所示。

從圖中我們可以看到,單選框、復(fù)選框、文本框和密碼框的元素標(biāo)簽都是input,此時單靠tagName無法準確地得到我們想要的元素,需要結(jié)合type屬性才能過濾出我們要的元素。示例代碼如下:

public class SearchElementsByTagName{

    public static void main(String[] args){

      WebDriver driver = new FirefoxDriver();

      driver.get("http://www.forexample.com");

      List<WebElement> allInputs = driver.findElements(By.tagName("input"));

      //只打印所有文本框的值

      for(WebElement e: allInputs){

         if (e.getAttribute(“type”).equals(“text”)){

         System.out.println(e.getText().toString()); //打印出每個文本框里的值

         }

      }

    }

}

4. By.className()

className屬性是利用元素的css樣式表所引用的偽類名稱來進行元素查找的方法。對于任何HTML頁面的元素來說,一般程序員或頁面設(shè)計師會給元素直接賦予一個樣式屬性或者利用css文件里的偽類來定義元素樣式,使元素在頁面上顯示時能夠更加美觀。一般css樣式表可能會長成下面這個樣子:

.buttonStyle{

  width: 50px;

  height: 50px;

  border-radius: 50%;

  margin: 0% 2%;

}

定義好后,就可以在頁面元素中引用上述定義好的樣式,如下:

<button name="sampleBtnName" id="sampleBtnId" class="buttonStyle">I'm Button</button>

如果此時我們要通過className屬性來查找該button并操作它的話,就可以使用className屬性了,代碼如下:

public class SearchElementsByClassName{

  public static void main(String[] args){

    WebDriver driver = new FirefoxDriver();

    driver.get("http://www.forexample.com");

    WebElement searchBox = driver.findElement(By.className("buttonStyle"));

    searchBox.sendKeys("Hello, world");

  }

}

注意:使用className來進行元素定位時,有時會碰到一個元素指定了若干個class屬性值的“復(fù)合樣式”的情況,如下面這個button:<button type="submit">登錄</button>。這個button元素指定了三個不同的css偽類名作為它的樣式屬性值,此時就必須結(jié)合后面要介紹的cssSelector方法來定位了,稍后會有詳細例子。

5. By.linkText()

這個方法比較直接,即通過超文本鏈接上的文字信息來定位元素,這種方式一般專門用于定位頁面上的超文本鏈接。通常一個超文本鏈接會長成這個樣子:

<a href="/intl/en/about.html" rel="external nofollow" >About Google</a>

我們定位這個元素時,可以使用下面的代碼進行操作:

public class SearchElementsByLinkText{

  public static void main(String[] args){

    WebDriver driver = new FirefoxDriver();

    driver.get("http://www.forexample.com");

    WebElement aboutLink = driver.findElement(By.linkText("About Google"));

    aboutLink.click();

  }

}

6. By.partialLinkText()

這個方法是上一個方法的擴展。當(dāng)你不能準確知道超鏈接上的文本信息或者只想通過一些關(guān)鍵字進行匹配時,可以使用這個方法來通過部分鏈接文字進行匹配。代碼如下:

public class SearchElementsByPartialLinkText{

  public static void main(String[] args){

    WebDriver driver = new FirefoxDriver();

    driver.get("http://www.forexample.com");

    WebElement aboutLink = driver.findElement(By.partialLinkText("About"));

    aboutLink.click();

  }

}

注意:使用這種方法進行定位時,可能會引起的問題是,當(dāng)你的頁面中不止一個超鏈接包含About時,findElement方法只會返回第一個查找到的元素,而不會返回所有符合條件的元素。如果你要想獲得所有符合條件的元素,還是只能使用findElements方法。

7. By.xpath()

這個方法是非常強大的元素查找方式,使用這種方法幾乎可以定位到頁面上的任意元素。在正式開始使用XPath進行定位前,我們先了解下什么是XPath。XPath是XML Path的簡稱,由于HTML文檔本身就是一個標(biāo)準的XML頁面,所以我們可以使用XPath的語法來定位頁面元素。

假設(shè)我們現(xiàn)在以圖(2)所示HTML代碼為例,要引用對應(yīng)的對象,XPath語法如下:

絕對路徑寫法(只有一種),寫法如下:

引用頁面上的form元素(即源碼中的第3行):/html/body/form[1]

注意:1. 元素的xpath絕對路徑可通過firebug直接查詢。2. 一般不推薦使用絕對路徑的寫法,因為一旦頁面結(jié)構(gòu)發(fā)生變化,該路徑也隨之失效,必須重新寫。3. 絕對路徑以單/號表示,而下面要講的相對路徑則以//表示,這個區(qū)別非常重要。另外需要多說一句的是,當(dāng)xpath的路徑以/開頭時,表示讓Xpath解析引擎從文檔的根節(jié)點開始解析。當(dāng)xpath路徑以//開頭時,則表示讓xpath引擎從文檔的任意符合的元素節(jié)點開始進行解析。而當(dāng)/出現(xiàn)在xpath路徑中時,則表示尋找父節(jié)點的直接子節(jié)點,當(dāng)//出現(xiàn)在xpath路徑中時,表示尋找父節(jié)點下任意符合條件的子節(jié)點,不管嵌套了多少層級(這些下面都有例子,大家可以參照來試驗)。弄清這個原則,就可以理解其實xpath的路徑可以絕對路徑和相對路徑混合在一起來進行表示,想怎么玩就怎么玩。

下面是相對路徑的引用寫法:

查找頁面根元素://

查找頁面上所有的input元素://input

查找頁面上第一個form元素內(nèi)的直接子input元素(即只包括form元素的下一級input元素,使用絕對路徑表示,單/號)://form[1]/input

查找頁面上第一個form元素內(nèi)的所有子input元素(只要在form元素內(nèi)的input都算,不管還嵌套了多少個其他標(biāo)簽,使用相對路徑表示,雙//號)://form[1]//input

查找頁面上第一個form元素://form[1]

查找頁面上id為loginForm的form元素://form[@id='loginForm']

查找頁面上具有name屬性為username的input元素://input[@name='username']

查找頁面上id為loginForm的form元素下的第一個input元素://form[@id='loginForm']/input[1]

查找頁面具有name屬性為contiune并且type屬性為button的input元素://input[@name='continue'][@type='button']

查找頁面上id為loginForm的form元素下第4個input元素://form[@id='loginForm']/input[4]

Xpath功能很強大,所以也可以寫得更加復(fù)雜一些,如下面圖(3)的HTML源碼。

如果我們現(xiàn)在要引用id為“J_password”的input元素,該怎么寫呢?我們可以像下面這樣寫:

WebElement password = driver.findElement(By.xpath("http://*[@id='J_login_form']/dl/dt/input[@id='J_password']"));

也可以寫成:

WebElement password = driver.findElement(By.xpath("http://*[@id='J_login_form']/*/*/input[@id='J_password']"));

這里解釋一下,其中//*[@id=' J_login_form']這一段是指在根元素下查找任意id為J_login_form的元素,此時相當(dāng)于引用到了form元素。后面的路徑必須按照源碼的層級依次往下寫。按照圖(3)所示代碼中,我們要找的input元素包含在一個dt標(biāo)簽內(nèi),而dt又包含在dl標(biāo)簽內(nèi),所以中間必須寫上dl和dt兩層,才到input這層。當(dāng)然我們也可以用*號省略具體的標(biāo)簽名稱,但元素的層級關(guān)系必須體現(xiàn)出來,比如我們不能寫成//*[@id='J_login_form']/input[@id='J_password'],這樣肯定會報錯的。

前面講的都是xpath中基于準確元素屬性的定位,其實xpath作為定位神器也可以用于模糊匹配。比如下面圖(4)所示代碼:

這段代碼中的“退出”這個超鏈接,沒有標(biāo)準id元素,只有一個rel和href,不是很好定位。不妨我們就用xpath的幾種模糊匹配模式來定位它吧,主要有三種方式,舉例如下。

a. 用contains關(guān)鍵字,定位代碼如下:

driver.findElement(By.xpath(“//a[contains(@href, ‘logout')]”));

這句話的意思是尋找頁面中href屬性值包含有l(wèi)ogout這個單詞的所有a元素,由于這個退出按鈕的href屬性里肯定會包含logout,所以這種方式是可行的,也會經(jīng)常用到。其中@后面可以跟該元素任意的屬性名。

b. 用start-with,定位代碼如下:

driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo')]));

這句的意思是尋找rel屬性以nofo開頭的a元素。其中@后面的rel可以替換成元素的任意其他屬性。

c. 用Text關(guān)鍵字,定位代碼如下:

driver.findElement(By.xpath(“//*[text()='退出']));

這個方法可謂相當(dāng)霸氣啊。直接查找頁面當(dāng)中所有的退出二字,根本就不用知道它是個a元素了。這種方法也經(jīng)常用于純文字的查找。

另外,如果知道超鏈接元素的文本內(nèi)容,也可以用

driver.findElement(By.xpath(“//a[contains(text(), '退出')]));

這種方式一般用于知道超鏈接上顯示的部分或全部文本信息時,可以使用。

最后,關(guān)于xpath這種定位方式,webdriver會將整個頁面的所有元素進行掃描以定位我們所需要的元素,所以這是一個非常費時的操作,如果你的腳本中大量使用xpath做元素定位的話,將導(dǎo)致你的腳本執(zhí)行速度大大降低,所以請慎用。

8. By.cssSelector()

cssSelector這種元素定位方式跟xpath比較類似,但執(zhí)行速度較快,而且各種瀏覽器對它的支持都相當(dāng)?shù)轿?,所以功能也是蠻強大的。

下面是一些常見的cssSelector的定位方式:

定位id為flrs的div元素,可以寫成:#flrs 注:相當(dāng)于xpath語法的//div[@id='flrs']

定位id為flrs下的a元素,可以寫成 #flrs > a 注:相當(dāng)于xpath語法的//div[@id='flrs']/a

定位id為flrs下的href屬性值為/forexample/about.html的元素,可以寫成: #flrs > a[href=”/forexample/about.html”]

如果需要指定多個屬性值時,可以逐一加在后面,如#flrs > input[name=”username”][type=”text”]。

明白基本語法后,我們來嘗試用cssSelector方式來引用圖(3)中選中的那個input對象,代碼如下:

WebElement password = driver.findElement(By.cssSelector("#J_login_form>dl>dt>input[id=' J_password']"));

同樣必須注意層級關(guān)系,這個不能省略。

cssSelector還有一個用處是定位使用了復(fù)合樣式表的元素,之前在第4種方式className里面提到過?,F(xiàn)在我們就來看看如何通過cssSelector來引用到第4種方式中提到的那個button。button代碼如下:

<button id="J_sidebar_login" class="btn btn_big btn_submit" type="submit">登錄</button>

cssSelector引用元素代碼如下:

driver.findElement(By.cssSelector("button.btn.btn_big.btn_submit"))

這樣就可以順利引用到使用了復(fù)合樣式的元素了。

此外,cssSelector還有一些高級用法,如果熟練后可以更加方便地幫助我們定位元素,如我們可以利用^用于匹配一個前綴,$用于匹配一個后綴,*用于匹配任意字符。例如:

匹配一個有id屬性,并且id屬性是以”id_prefix_”開頭的超鏈接元素:a[id^='id_prefix_']

匹配一個有id屬性,并且id屬性是以”_id_sufix”結(jié)尾的超鏈接元素:a[id$='_id_sufix']

匹配一個有id屬性,并且id屬性中包含”id_pattern”字符的超鏈接元素:a[id*='id_pattern']

最后再總結(jié)一下,各種方式在選擇的時候應(yīng)該怎么選擇:

1. 當(dāng)頁面元素有id屬性時,最好盡量用id來定位。但由于現(xiàn)實項目中很多程序員其實寫的代碼并不規(guī)范,會缺少很多標(biāo)準屬性,這時就只有選擇其他定位方法。

2. xpath很強悍,但定位性能不是很好,所以還是盡量少用。如果確實少數(shù)元素不好定位,可以選擇xpath或cssSelector。

3. 當(dāng)要定位一組元素相同元素時,可以考慮用tagName或name。

4. 當(dāng)有鏈接需要定位時,可以考慮linkText或partialLinkText方式。

參考資料:

Selenium Webdriver Practical Guide

到此這篇關(guān)于Selenium Webdriver元素定位的八種常用方式(小結(jié))的文章就介紹到這了,更多相關(guān)Selenium Webdriver元素定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用pycharm創(chuàng)建Django項目失敗的解決方案

    使用pycharm創(chuàng)建Django項目失敗的解決方案

    使用PyCharm創(chuàng)建Django項目時遇到無法運行的問題,可以檢查Python的安裝路徑設(shè)置是否正確,在PyCharm的設(shè)置中找到項目解釋器的位置,確保路徑正確,如果不確定Python的安裝位置,可以在命令提示符中使用“where Python”命令查詢
    2024-09-09
  • LyScript實現(xiàn)繞過反調(diào)試保護的示例詳解

    LyScript實現(xiàn)繞過反調(diào)試保護的示例詳解

    LyScript插件中內(nèi)置的方法可實現(xiàn)各類反調(diào)試以及屏蔽特定API函數(shù)的功能,這類功能在應(yīng)對病毒等惡意程序時非常有效。本文為大家提供了LyScript實現(xiàn)繞過反調(diào)試保護的示例代碼,感興趣的可以了解一下
    2022-08-08
  • Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法

    Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤的方法

    這篇文章主要介紹了Deepsort + Yolo 實現(xiàn)行人檢測和軌跡追蹤,本項目通過采用深度學(xué)習(xí)方法實現(xiàn)YOLO算法行人檢測和deepsort算法對人員定位的和軌跡跟蹤,需要的朋友可以參考下
    2021-09-09
  • python如何實現(xiàn)遞歸轉(zhuǎn)非遞歸

    python如何實現(xiàn)遞歸轉(zhuǎn)非遞歸

    這篇文章主要介紹了python如何實現(xiàn)遞歸轉(zhuǎn)非遞歸,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python中%是什么意思?python中百分號如何使用?

    Python中%是什么意思?python中百分號如何使用?

    最近在學(xué)習(xí)python過程中,發(fā)現(xiàn)了%的一些情況,這里就簡單介紹一下,,需要的朋友可以參考下
    2018-03-03
  • python協(xié)程gevent案例 爬取斗魚圖片過程解析

    python協(xié)程gevent案例 爬取斗魚圖片過程解析

    這篇文章主要介紹了python協(xié)程gevent案例 爬取斗魚圖片過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python Django框架實現(xiàn)web端分頁呈現(xiàn)數(shù)據(jù)

    python Django框架實現(xiàn)web端分頁呈現(xiàn)數(shù)據(jù)

    這篇文章主要介紹了python Django框架實現(xiàn)web端分頁呈現(xiàn)數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python自動連接ssh的方法

    Python自動連接ssh的方法

    這篇文章主要介紹了Python自動連接ssh的方法,實例分析了基于Python實現(xiàn)連接ssh的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • Python遞歸遍歷列表及輸出的實現(xiàn)方法

    Python遞歸遍歷列表及輸出的實現(xiàn)方法

    這篇文章主要介紹了Python遞歸遍歷列表及輸出的實現(xiàn)方法,可實現(xiàn)遞歸遍歷列表中的每一項,若是元祖則判斷是否為基本類型然后輸出,需要的朋友可以參考下
    2015-05-05
  • Python實現(xiàn)對Excel表格的操作詳解

    Python實現(xiàn)對Excel表格的操作詳解

    這篇文章主要介紹了Python實現(xiàn)對Excel表格的操作,在數(shù)據(jù)處理和報告生成等工作中,Excel表格是一種常見且廣泛使用的工具,使用Python來處理Excel表格能夠大大的提升效率,感興趣的同學(xué)可以參考下
    2024-02-02

最新評論