上兩篇的博文中介紹了python selenium的環境搭建和編寫的第一個自動化測試腳本,從第二篇的例子中看出來再做UI級別的自動化測試的時候,有一個至關重要的因素,那就是元素的定位,只有從頁面上找到這個元素,我們從能對這個元素進行操作,那么我們下來看看如何來定位元素。
selenium 提供了8中元素定位的方法(大家要學習元素的定位,首先可以學習下前端的基礎知識,這樣有利於我們學習自動化測試,大家可以看一下:http://www.runoob.com/)
- 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
下面我們詳細的介紹一下,每個方法的含義以及每個方法的使用。
1.find_element_by_id 根據標簽id定位
示例HTML代碼:
<html> <body> <input id="kw" name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> </body> <html>
網頁需要通過開發者工具,打開瀏覽器按F12獲取頁面元素,我們已經看到上述的頁面html代碼,我們現在要查找id="kw"的元素
driver.find_element_by_id('kw') #通過id定位
2.find_element_by_name 根據標簽的name定位
driver.find_element_by_name('username') #通過name定位
3.find_element_by_xpath 根據xpath定位
driver.find_element_by_xpath('//*[@id="kw"]')
這里要介紹一下如何獲取頁面元素的xpath路徑的方法,如果你是大神可以自己寫,如果跟作者一樣很嘍,可以通過開發者工具獲取,選擇元素右擊->Copy->Copy Xpath,可以直接拷貝到xpath路徑.

4.find_element_by_link_text和find_element_by_partial_link_text 通過文字鏈接來定位元素,他們兩個很相像,功能也很類似,但是他們一個是匹配全部,一個是匹配部分。
給我們之前的示例代碼增加一段,我們來看看如何定位
<html> <body> <input id="kw" name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <div id="u1"> <a href="http://news.baidu.com" name="tj_trnews" class="mnav">新聞</a> <a href="http://www.hao123.com" name="tj_trhao123" class="mnav">hao123</a> <a href="http://map.baidu.com" name="tj_trmap" class="mnav">地圖</a> <a href="http://v.baidu.com" name="tj_trvideo" class="mnav">視頻</a> <a href="http://tieba.baidu.com" name="tj_trtieba" class="mnav">貼吧</a> <a href="http://xueshu.baidu.com" name="tj_trxueshu" class="mnav">學術</a> </body> <html>
下面我們用兩種方法來定位一下《新聞》這個元素
通過來find_element_by_link_text定位
#-*- coding:utf-8 -*- import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get("file:///C:/Users/hunk/Desktop/id.html") driver.find_element_by_link_text('新聞').click() time.sleep(3) driver.quit() #退出瀏覽器
定位效果:

通過來find_element_by_partial_link_text定位

5.find_element_by_tag_name根據標簽的名字定位,這種方法很不使用,因為一個頁面的中的標簽的名字重復度太早,定位起來太不容易。
driver.find_element_by_tag_name("input")
6.find_element_by_class_name通過class name 定位
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
driver.find_element_by_class_name('content') #通過class name 定位
7.find_element_by_css_selector 根據元素屬性來定位,這個方法在實際過程中比較實用,而且很簡單,下面我們先看一下語法,這里有一個比較關鍵點就是,在這個定位的方法是可以寫正則表達式來定位元素,然后在寫一個實例來定位,實例我們采用百度網站來定位,然后搜索selenium關鍵字。
<html> <body> <p class="content">Site content goes here.</p> </body> <html>
定位語法
driver.find_element_by_css_selector("p[class=\"content\"]") #根據元素屬性
示例:
#-*- coding:utf-8 -*- import time from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get("http://www.baidu.com") driver.find_element_by_css_selector("input[id=\"kw\"]").send_keys('selenium') #定位輸入框輸入selenium driver.find_element_by_css_selector("input[type=\"submit\"]").click() #定位搜索按鈕點擊按鈕,屬性選擇type time.sleep(5) driver.quit() #退出瀏覽器
來看一下動畫效果吧

其實元素的定位很簡單,只是實際過程中定位的html頁面有一些特殊的地方,只要我們拆解分析,自然也難不倒我們。
下面這幾個方法返回的結果是列表,跟單個元素定位一樣,只是返回的結果不同,這里就不詳細介紹了。
- find_elements_by_id
- 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
