[譯]Selenium Python文檔:四、元素定位


要定位一個頁面中的元素有多中策略和方法。你可以根據實際情況選擇其中最為合適的。Selenium為定位頁面元素提供了下面的這些方法:

  • find_element_by_id(使用id)
  • find_element_by_name(使用name屬性值)
  • find_element_by_xpath(使用XPath)
  • find_element_by_link_text(使用顯示文本)
  • find_element_by_partial_link_text(使用超鏈接文本)
  • find_element_by_tag_name(使用標簽名)
  • find_element_by_class_name(使用類名)
  • find_element_by_css_selector(使用CSS選擇器)

要定位多個元素,除了通過id進行定位,只需將elements+s(這些元素將會一個列表的形式返回)

  • find_elements_by_name(使用name屬性值)
  • find_elements_by_xpath(使用XPath)
  • find_elements_by_link_text(使用顯示文本)
  • find_elements_by_partial_link_text(使用超鏈接文本)
  • find_elements_by_tag_name(使用標簽名)
  • find_elements_by_class_name(使用類名)
  • find_elements_by_css_selector(使用CSS選擇器)

除了上面的通用方法外,在一個頁面對象進行訪問操作的時候還有兩個非常有用的私有方法:find_elementfind_elements

使用樣例:

from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

By類可用的屬性如下:

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

4.1.通過id進行定位

當知道一個元素的id屬性時可以使用這種方法。使用該方法,將會返回第一個匹配給定id屬性值得元素。如果沒有元素匹配,將會拋出一個NoSuchElementException異常。

比如,考慮一下下面的頁面源碼:

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
  </form>
 </body>
<html>

form元素可以通過下面的方法進行定位:

login_form = driver.find_element_by_id("loginForm")

4.2.通過name屬性進行定位

當知道一個元素的name屬性時可以使用此方法。使用此方法,將會返回匹配給定name屬性值的第一個元素。如果沒有相匹配的元素,將會拋出一個NoSuchElementException異常。

比如,考慮一下下面的網頁源碼:

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
</body>
<html>

usernamepassword元素可以向下面這樣定位:

username = driver.find_element_by_name('username')
password = driver.find_element_by_name('password')

下面將會返回Login按鈕,因為他出現在Clear按鈕的前面:

continue = driver.find_element_by_name('continue')

4.3.使用XPath進行定位

XPath是一種用於定位XML文檔節點的語法。因為HTML可以是一種XML實現(XHTML),Selenium用戶可以使用這種強大的語言工具來定位他們頁面應用的元素。XPath擴展了僅僅通過id和name屬性進行元素定位的簡單方法(XPath也支持),為元素定位開辟了更多的可能。比如定位頁面中的第三個單選框。

當你想要定位的元素沒有合適的id和name的時候,使用XPath會是一個比較好的選擇。你可以使用XPath通過絕對路徑或者相對路徑定位沒有id和name屬性的元素(不推薦使用絕對路徑)。除了id和name,XPath定位器也可以通過其他屬性指定元素。

XPath包含一個HTML中從根節點開始所有元素的定位,所以當你單獨定位一個元素失敗的時候,可以稍稍做些調整,通過定位一個緊鄰的帶有id或name屬性的元素,基於相對關系進而定位到你想要的目標元素(最好是一個父節點元素)。只需做很小的改變,你的測試腳本的魯棒性/穩健性就會大大增強。

舉個例子,考慮一下下面的頁面源碼:

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
   <input name="continue" type="button" value="Clear" />
  </form>
</body>
<html>

form元素可以像下面這樣進行定位:

login_form = driver.find_element_by_xpath("/html/body/form[1]")
login_form = driver.find_element_by_xpath("//form[1]")
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")
  1. 絕對路徑(HTML只要稍微變動就會失效)
  2. HTML中的第一個form元素
  3. id屬性值為loginForm的form元素

username元素可以像下面這樣定位:

username = driver.find_element_by_xpath("//form[input/@name='username']")
username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
username = driver.find_element_by_xpath("//input[@name='username']")
  1. 有一個input子元素,name屬性為username的form元素
  2. id屬性為loginForm的form元素的第一個input子元素
  3. name屬性為username的第一個input元素

Clear按鈕元素可以像下面這樣定位:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")
  1. name屬性為continue,type屬性為button的input元素
  2. id屬性為loginForm的form元素的第四個input子元素

這些示例只包含一些基礎使用,想要了解更詳細的相關信息,推薦瀏覽:

也有一些優秀的瀏覽器插件可以用來輔助編寫定位元素的XPath:

4.4.通過鏈接文本定位超鏈接

當知道一個錨點標簽內使用的鏈接文本時可以使用本方法。此方法將會返回匹配鏈接文本的第一個元素。如果沒有相匹配的元素,將拋出一個NoSuchElementException異常。

舉個例子,考慮一下下面的網頁源碼:

<html>
 <body>
  <p>Are you sure you want to do this?</p>
  <a href="continue.html">Continue</a>
  <a href="cancel.html">Cancel</a>
</body>
<html>

continue.html鏈接可以像下面這樣進行定位:

continue_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

4.5.通過標簽名定位元素

當想要通過標簽名定位元素時可以使用此方法。使用此方法,將會返回匹配給定標簽名的第一個元素。如果沒有相匹配的元素,將會拋出一個NoSuchElementException異常。

舉個例子,考慮一下下面的網頁源碼:

<html>
 <body>
  <h1>Welcome</h1>
  <p>Site content goes here.</p>
</body>
<html>

標題元素(h1)可以像下面這樣定位:

heading1 = driver.find_element_by_tag_name('h1')

4.6.通過類名定位元素

當想要通過類名(class)屬性定位元素時可以使用此方法。使用此方法,將會返回匹配給類名屬性的第一個元素。如果沒有相匹配的元素,將會拋出一個NoSuchElementException異常。

舉個例子,考慮下面的網頁源碼:

<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>

p元素可以像下面這樣進行定位:

content = driver.find_element_by_class_name('content')

4.7.使用CSS選擇器定位元素

當想要使用CSS選擇器語法定位元素時可以使用此方法。使用此方法,將會返回匹配給定CSS 選擇器的第一個元素。如果沒有相匹配的元素,將會拋出一個NoSuchElementException異常。

舉個例子,考慮一下下面的網頁源碼:

<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>

p元素可以像像下面這樣進行定位:

content = driver.find_element_by_css_selector('p.content')

Sauce Labs 上有關於 CSS 選擇器的優秀文檔.


免責聲明!

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



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