selenium之find_element_by_xpath定位元素


一 方法

selenium為定位元素提供了較多方法,大致分為單元素定位和多元素定位.

# 查找單個元素:

find_element_by_id find_element_by_name find_element_by_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
# 查找多個元素
find_elements_by_name
find_elements_by_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
# 兩個私有方法
find_element
find_elements

 二 用法

 2.1 find_element和find_elements用法

from selenium.webdriver.common.by import By

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

按各種分類的屬性如下:

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"

2.2 按IP定位

login_form = driver.find_element_by_id('loginForm')

使用此策略,將返回id屬性值與位置匹配的第一個元素如果沒有元素具有匹配的id屬性,NoSuchElementException則將引發a。

2.3 按name定位

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

使用此策略,將返回name屬性值與位置匹配的第一個元素如果沒有元素具有匹配的name屬性,NoSuchElementException則將引發a。

2.4 通過XPath定位

使用XPath的主要原因之一是,當您沒有想要查找的元素的合適的id或name屬性時。您可以使用XPath以絕對術語(不建議使用)定位元素,也可以相對於具有id或name屬性的元素定位。XPath定位器還可用於通過id和name以外的屬性指定元素。

絕對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>

如下定位:

# 絕對路徑(如果僅對HTML進行少許更改,則會中斷)
login_form = driver.find_element_by_xpath("/html/body/form[1]")
# HTML中的第一個表單元素
login_form = driver.find_element_by_xpath("//form[1]")
# 具有名為id的屬性和值為loginForm的表單元素
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")

2.4.1 絕對路徑(如果僅對HTML進行少許更改,則會中斷)

login_form = driver.find_element_by_xpath("/html/body/form[1]")

2.4.2 元素及其屬性定位

查找具體的元素,必須在前面輸入標准開頭//,表示從當前節點尋找所有的后代元素

//div/*          div下面的所有的元素
 
//div//p         先在整個文檔里查找div,再在div里查找p節點(只要在內部,不限定是否緊跟) ;等價於 css_selector里的('div p')
 
//div/p          p是div的直接子節點; 等價於 css_selector里的('div > p')
 
//*[@style]      查找所有包含style的所有元素,所有的屬性要加@;  等價於 css_selector里的('*[style]')
 
//p[@spec='len'] 必須要加引號;等價於 css_selector里的("p[spec='len']")
 
//p[@id='kw']    xpath中對於id,class與其他元素一視同仁,沒有其他的方法

2.4.3 選擇節點位置

//div/p[2]                   選擇div下的第二個p節點 ;等價於css_selector里的div>p:nth-of-type(2)  符合p類型的第二個節點
 
//div/*[2]                   選擇div下第二個元素
 
//div/p[position()=2]        position()=2   指定第二個位置;  等價於上面的 //div/p[2] 
 
          position()>=2      位置大於等於2
 
          position()<2       位置小於2
 
          position()!=2     位置不等於2
 
//div/p[last()]              選擇div下的倒數第一個p節點; last()倒數第一個
 
//div/p[last()-1]            選擇div下的倒數第二個p節點;
 
//div/p[position()=last()]   倒數第一個
 
//div/p[position()=last()-1] 倒數第二個
 
//div/p[position()>=last()-2]倒數第一個,第二個,第三個

2.4.4 組合定位

//p | //button                       選擇所有的p和button,等價於css_selector里的 p, button
 
//input[@id='kw' and @class='su']    選擇id=kw 並且 class=su的input元素

2.4.5 兄弟節點

相鄰后面的兄弟節點的選擇:following-sibling::    兩個冒號

//div/following-sibling::p    選擇div里相鄰的p節點

相鄰前面的兄弟節點的選擇:preceding-sibling::         此方法在css_selector中沒有

//div/preceding-sibling::p[2]   選擇div里前面相鄰的第二個節點,不加[2]選擇的是前面的所有的p節點

2.4.6 父節點

//p[@spec='len']/..      選擇p節點的上層節點       此方法在css_selector中沒有
 
//p[@spec='len']/../..   上層節點的上層節點

2.5 通過鏈接文本找超鏈接

<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_link = driver.find_element_by_link_text('Continue')
continue_link = driver.find_element_by_partial_link_text('Conti')

使用此策略,將返回鏈接文本值與位置匹配的第一個元素。如果沒有元素具有匹配的鏈接文本屬性,NoSuchElementException則將引發a。

 2.6 通過標簽名稱定位

<html>
 <body>
  <h1>Welcome</h1>
  <p>Site content goes here.</p>
</body>
<html>
heading1 = driver.find_element_by_tag_name('h1')

使用此策略,將返回具有給定標簽名稱的第一個元素。如果沒有元素具有匹配的標簽名稱,NoSuchElementException 則將引發a。

2.7 通過class定位

 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>
content = driver.find_element_by_class_name('content')

使用此策略,將返回具有匹配類屬性名稱的第一個元素。如果沒有元素具有匹配的類屬性名稱,NoSuchElementException則將引發a。

2.8 通過CSS選擇器定位

<html>
 <body>
  <p class="content">Site content goes here.</p>
</body>
<html>
content = driver.find_element_by_css_selector('p.content')

使用此策略,將返回具有匹配CSS選擇器的第一個元素。如果沒有元素具有匹配的CSS選擇器,NoSuchElementException則將引發a。

 感謝Cyberverseselenium

 結束!


免責聲明!

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



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