說到元素定位,不得不說一下Firefox的兩個插件firepath和firebug。firepath主要是彌補selenium IDE有時候錄製一些網頁元素無法定位到的缺陷,幫助查找元素。firebug主要用於網頁的元素定位,是強大的元素定位工具。不過,火狐在更新到57版本之後,對這些使用舊技術實現的插件都不再支持了,但也可以通過在瀏覽器查看元素。瀏覽器更新換代較快,大部分的網站採用較新的技術架構,用戶也很少會使用太古老的瀏覽器版本,所以這裏就不對firebug和firepath的使用操作做展示了。
元素的定位方法主要有以下七種:
一、find_element_by_id
id是最好的定位方式,使用id定位元素可以保證定位的唯一性。所有核心頁面元素都添加ID屬性,可以提高網頁的可測試性。
driver.find_element_by_id('su') #定位id值爲su的元素
二、find_element_by_name
name同樣是好的定位方式,一般而言,那name也是唯一的,但是也有一些頁面涉及多個類似功能按鈕或者其他,name屬性會重複使用相同的屬性值。所以使用name前,最好是先用屬性值在瀏覽器上查詢當前頁面是否存在多個相同的屬性值,如果是唯一的,大可放心使用find_element_by_name這種定位方式。如果有多個,考慮其他屬性定位或者用find_elements_by_name。使用find_elements最值得注意的是指定位置,正常情況下通過瀏覽器查找是知道準確的位置的,但也有特殊的時候,發現目標處於第三個位置,實際可能是第二個,碰到此類問題,多點調試,找到準確的。
三、find_element_by_className
className和id用法是一樣的,但class很多時候都不是唯一的,class定義標籤的樣式,頁面爲了樣式統一,所以一般會有多個class,這時還是要用find_elements定位。
driver.find_elements_by_className('btn')[2] #定位第2個‘class屬性值爲btn’的元素
class定位失敗可能的原因:當classname 中存在空格的時候,直接使用find_element_by_class_name時,會顯示定位失敗,此時,需要將classname中的空格替換成英文的點“.”,如下圖:
錯誤用法:find_element(By.CLASS_NAME,"table table-striped table-borderd table-hover dataTable no-footer")
正確用法:find_element(By.CLASS_NAME,"table.table-striped.table-borderd.table-hover.dataTable.no-footer")
四、link_text
find_element_by_link_text:全匹配
find_element_by_partial_link_text:關鍵詞匹配
五、find_element_by_xpath
xpath (XML Path Language),是W3C定義的用來在XML文檔中選擇節點的語言,可以用來對頁面元素層級與邏輯組合定位。xpath相對與css有較大的靈活性,既可以向前也可以向後搜索,但定位速度比css的稍慢。
//表示從匹配選擇的當前節點開始選擇文檔中的節點,而不考慮它們的位置。
//input[2],2是索引號,根據該頁面元素在頁面中相同的標籤名之間的索引位置進行定位。
模糊屬性值定位:("//a[contains(text(), '新聞')]") //查找text中包含"新聞"的元素
("//input[starts-with(@id, 'k']") //查找id以"k"開頭的元素
("//input[ends-with(@id, 'w']") //查找id以"w"結尾的元素
("//input[matchs(@id, 'k*']") //正則表達式查找元素
軸定位元素:
(//img[@alt=’div2-img2’]/parent::div) //基於img元素位置找到上一級的div
(//div[@id=’div1’]/child::img) //基於div找到下層節點中的img元素
文本定位元素:
(//a[contains(.,”百度”)]) //查找文本內容中含”百度”關鍵字的鏈接
(//span[.=”發送成功”]) //span標籤是否含有“發送成功”的文本
六、find_element_by_tag_name
tag往往用來定義一類功能,所以通過tag識別某個元素的概率很低。任意打開一個頁面,都會發現大量的<div>、<input>、<a>等tag,所以tag_name定位很少用。這種定位方式主要用於匹配多個頁面元素的情況,將查找到的網頁元素對象進行計算、遍歷、修改屬性等操作。
七、find_element_by_css_selector
css定位方式相對與xpath,定位速度會快些,不過在肉眼範圍內,定位速度的差距並不明顯,習慣性,本人基本不使用css對元素進行定位。css使用選擇器來爲頁面元素綁定屬性,可以靈活地選擇控件的任意屬性。
1 <input class="u-btn mart5" type="submit" οnclick="return User.check()" value="登錄">
2 driver.find_element_by_css_selector(".u-btn.mart5").click()
以上就是七種主要的元素定位方法。
注:部分文章粉絲可見或自己可見。