WebDriver--定位元素的8種方式

在UI層面的自動化測試開發中,元素的定位與操做是基礎,也是常常遇到的困難所在。webdriver提供了8種定位:css

1. id定位:find_element_by_id("id值");id屬性是惟一的html

1 driver.find_element_by_id("loginName").clear()#用戶名輸入框的id屬性 2 driver.find_element_by_id("loginName").send_keys("admin") 3 driver.find_element_by_id("pwdTip").send_keys(Keys.TAB)#密碼輸入框的id屬性 4 driver.find_element_by_id("pwdTip").send_keys("111111")

2. name定位:元素的名稱,find_element_by_name("name值");name屬性值在當前頁面能夠不惟一web

1 driver.find_elements_by_name("PeriodName")[1].click()#選擇學段:初中
2 driver.find_elements_by_name("SubjectName")[0].click()#選擇學科:語文

  find_elements_by_name("PeriodName")是由於當前頁面有一組radiobutton的name值是PeriodName,因此能夠用定位一組元素的方法findElements,定位出來的是結果一個list測試

3. class定位:元素的類名,find_element_by_class_name("class值")spa

driver.find_elements_by_class_name("u-btn-levred")[0].click()#選擇年級:七年級

4. tag定位:頁面html文檔下的各類標籤,find_element_by_tag_name("input");插件

tag每每用來定義一類功能,因此經過tag識別某個元素的機率很低。任意打開一個頁面,都會發現大量的<div>、<input>、<a>等tag,因此tag name定位不多用code

5. link定位:專門用來定位文本連接,find_element_by_link_name("text");htm

driver.find_element_by_link_text(u"退出").click()#頁面右上方的一些我的操做,好比退出、我的中心、消息通知等

6. partial link定位:是對link定位的一種補充,當連接上的文本內容比較長的時候,能夠取文本的一部分進行定位,固然這部分能夠惟一地標識這個連接blog

※注:以上的方式稍有侷限,且常常頁面沒有id,name這些屬性值,class name重複性較高,link定位有針對性,因此Xpath與Css定位更靈活些。ip

7. XPath定位:find_element_by_xpath("");有多種定位策略,用FirePath插件自動生成的涵蓋如下幾種方式

  1)絕對路徑定位:對於沒有id,name、classname很差定位的,這也是我最經常使用的,由於能夠經過Firefox的FirePath插件能夠方便的獲取到xpath值

  2)利用元素屬性定位:

  find_element_by_xpath(".//*[@id='Title']"),這裏是用的id,也能夠用元素其餘可以惟一標識的屬性,不侷限於id、name、class這些;*表明的是標籤名,不指定時就能夠用*代替

  3)層級與屬性結合:下圖中就是這種

  4)使用邏輯運算符

1 driver.find_element_by_xpath(".//*[@id='divword']/input[7]").click()#登陸
2 driver.find_element_by_xpath("html/body/div[4]/div/div[2]/div/div[3]/a[1]").click()#我的頁面的發佈課程操做

8. CSS定位(薄弱,用的不多,但很強大,比xpath簡潔靈活):使用選擇器來爲頁面元素綁定屬性,能夠靈活地選擇控件的任意屬性;find_element_by_css_selector("");一樣也能夠用FirePATH生成css喲!

  1)經過class屬性定位:點號(".")表示經過class屬性定位

1 <input class="u-btn mart5" type="submit" onclick="return User.check()" value="登陸">
2 driver.find_element_by_css_selector(".u-btn.mart5").click()

  2)經過id屬性定位:("#")表示經過id定位元素

driver.find_element_by_css_selector("#loginName")

  3)經過其餘屬性定位:("[]"),中括號裏的屬性能夠惟一標識這個元素就能夠;屬性的值能夠加引號,也能夠不加

1 <input class="u-btn mart5" type="submit" onclick="return User.check()" value="登陸">
2 driver.find_element_by_css_selector("[type=submit]").click()

  4)組合定位

 

平時使用生成的xpath,id,name,classname這些比較多,今天根據最近這段時間的實踐,並參照書上整理了下,發現原來XPath和Css下還有這麼多方式,順便拿最近一些代碼試驗了下,有些簡單的css定位可以成功,有的Firepath生成的並不可用,一些組合定位還須要再研究,是有些難度的。最後記錄一種定位方式,更接近底層實現方式的定位,But書上說webdriver更推薦前面那些寫法,爲毛捏?

9. 用By定位元素

  除find_element_by_***這種方式,還有另外一套寫法,也就是統一調用find_element()方法,兩個參數,第一個參數是定位的類型,由By提供;第二個參數是定位的具體值

from selenium.webdriver.common.by import By #使用By這種定位前要將By類導入 find_element(By.ID,"loginName") find_element(By.NAME,"SubjectName") find_element(By.CLASS_NAME,"u-btn-levred") find_element(By.TAG_NAME,"input") find_element(By.LINK_TEXT,"退出") find_element(By.PARTIAL_LINK_TEXT,"退") find_element(By.XPATH,".//*[@id='Title") find_element(By.CSS_SELECTOR,"[type=submit]")
相關文章
相關標籤/搜索