Selenium+Python常見定位方法


 參見官網:http://selenium-python.readthedocs.io/locating-elements.html

有多種策略來定位頁面中的元素。你可以使用最適合你的情況。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
  常用方法是通過xpath相對路徑進行定位,同時CSS也是比較好的方法。

舉例:

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

按照ID元素定位(find_element_by_id):

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

 

login_form = driver.find_element_by_id('loginForm')

按照NAME元素定位(find_element_by_name):

當你知道一個元素的name屬性時使用它。使用此策略,將返回具有與該位置匹配的id屬性值的第一個元素。如果沒有元素具有匹配的id 屬性,NoSuchElementException則會引發a。

用戶名和密碼元素可以像這樣定位

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


這會給出“登錄”按鈕,因為它出現在“清除”按鈕之前
continue = driver.find_element_by_name('continue')

 

通過XPATH元素定位(find_element_by_xpath):

XPath是用於在XML文檔中查找節點的語言。由於HTML可以是XML(XHTML)的實現,所以Selenium用戶可以利用這種強大的語言來定位Web應用程序中的元素。XPath擴展了(也支持)通過id或name屬性定位的簡單方法,並打開了各種新的可能性,例如在頁面上定位第三個復選框。

使用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>

 用戶名元素可以像這樣定位:

    username = driver.find_element_by_xpath("//form[input/@name='username']")  #  form元素通過一個input子元素,name屬性和值為username實現
    username = driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")    # 通過id=loginForm值的form元素找到第一個input子元素
    username = driver.find_element_by_xpath("//input[@name='username']")   #  屬性名為name且值為username的第一個input元素

表單元素這樣定位:

login_form = driver.find_element_by_xpath("/html/body/form[1]")          # 絕對路徑(如果HTML只是稍微改變就會中斷)
login_form = driver.find_element_by_xpath("//form[1]")                   # HTML中的第一個表單元素
login_form = driver.find_element_by_xpath("//form[@id='loginForm']")     # 屬性名為id和值為loginForm的表單元素

 “清除”按鈕元素可以像這樣定位:

clear_button = driver.find_element_by_xpath("//input[@name='continue'][@type='button']")   # 輸入屬性名為name,值為continue,屬性名為type,值為button
clear_button = driver.find_element_by_xpath("//form[@id='loginForm']/input[4]")            # 表單元素的第四個輸入子元素,具有名為id和值為loginForm的屬性


更多Xpath知識參見:http://www.w3school.com.cn/xpath/index.asp

 

通過Link Text元素定位(通過鏈接文本找超鏈接)find_element_by_link_text

當你知道在一個錨標簽中使用的鏈接文本時,使用它。采用這種策略,將返回鏈接文本值與該位置匹配的第一個元素。如果沒有元素具有匹配的鏈接文本屬性,NoSuchElementException則會引發a。

如:考慮這個頁面的來源。

<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')

通過標記名稱查找元素(find_element_by_tag_name

當你想通過標簽名找到一個元素時使用它。采用這種策略,將返回具有給定標簽名稱的第一個元素。如果沒有元素具有匹配的標簽名稱,NoSuchElementException 則會引發一個。

如:考慮這個頁面的來源。

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

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

heading1 = driver.find_element_by_tag_name('h1')

通過類名稱查找元素(find_element_by_class_name

當你想通過class屬性名來定位一個元素的時候使用它。使用這個策略,將返回具有匹配的類屬性名稱的第一個元素。如果沒有元素具有匹配的類屬性名稱,NoSuchElementException則會引發a。

 如:考慮這個頁面的來源

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

“p”元素可以像這樣定位:

content = driver.find_element_by_class_name('content')

通過CSS選擇器查找元素(find_element_by_css_selector

例如,考慮這個頁面的來源:

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

“p”元素可以像這樣定位:

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

 

練習元素定位網址:http://sahitest.com/demo/formTest.htm


免責聲明!

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



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