在做WEB自動化時,最重要的的就是操作頁面上的元素,這就要求我們必修找到這些元素,然後才能操作這些元素。工具或代碼無法像我們測試人員一樣用肉眼來分辨頁面上的元素。那麼我們怎麼來定位這些元素呢?
selenium webdriver提供瞭如下八種元素定位的方法:
id, name, class name, tag name,link text, partial link text, xpath, css selector
舉例睿江雲登錄頁面,賬號框及註冊調整下的元素信息
賬號輸入框: <input _ngcontent-c1="" class="login-input ng-untouched ng-pristine ng-valid" placeholder="請輸入賬號(手機號碼/電子郵箱)" type="text" id="email">註冊標籤: <a _ngcontent-c6="" href="#/register" routerlink="/register" name="register">立即註冊</a>
1. id定位:find_element_by_id(“id值”)
如賬號輸入框下的id值爲email: find_element_by_id('email').clear() #清空賬號框下的text find_element_by_id('email').send_keys("[email protected]") #輸入賬號值爲[email protected]
2. name定位:find_element_by_name(“name值”)
也有元素沒有id或不唯一,可用如註冊標籤下的name值對應register: find_element_by_name('register').click() #點擊立即註冊標籤操作
3. class定位:元素的類名,find_element_by_class_name(“class值”)
如賬號輸入框下的class值爲login-input ng-untouched ng-pristine ng-valid: find_element_by_class_name('login-input ng-untouched ng-pristine ng-valid').send_keys("[email protected]") #輸入賬號值爲[email protected]
4. tag name定位:find_element_by_tag_name(“tag值”)
拿註冊爲例: find_element_by_tag_name("a").cilck() #點擊立即註冊標籤操作HTML的本質就是通過tag來定義實現不同的功能,每一個元素本質上也是一個tag。tag往往用來定義一類功能,所以通過tag識別某個元素的概率很低。如頁面存在大量的<div>,<input>,<a>等tag。
5. link text定位:find_element_by_link_text(“text值”)
link專門用來定位文本鏈接。也是拿註冊爲例a標籤的元素爲立即註冊 find_element_by_link_text("立即註冊").cilck() #點擊立即註冊標籤操作
6. partial link text定位:find_element_by_partial_link_text(”text值”)
partial link text是對link text的補充,有些文本鏈接會比較長,此時可以取部分文本進行定位。 find_element_by_partial_link_text("立即註冊").cilck() #點擊立即註冊標籤操作
7. css selector 定位:find_element_by_css_selector(“css值”)
可以理解爲css 選擇器,我們可以利用元素的任意css元素來進行定位,比如在元素的class屬性爲多個值時,可以使用 tagname+class的方式來定位如賬號輸入框爲input,class爲:login-input ng-untouched ng-pristine ng-valid。 find_element_by_css_selector("input.login-input.ng-untouched.ng-pristine.ng-valid")
8. xpath定位:find_element_by_xpath(“xpath值”)
有多種定位策略,用FirePath插件自動生成的涵蓋以下幾種方式
1)絕對路徑定位:
對於沒有id,name、classname不好定位的,這也是最常用的,因爲可以通過Firefox的FirePath插件可以方便的獲取到xpath值
2)利用元素屬性定位:
find_element_by_xpath(".//*[@id='email']").send_keys("[email protected]") ,這裏是用的id,也可以用元素其他能夠唯一標識的屬性,不侷限於id、name、class這些;*代表的是標籤名,不指定時就可以用*代替
3)層級與屬性結合:下圖