selenium 是一個(gè)用于Web應(yīng)用程序測(cè)試的工具毡琉。Selenium測(cè)試直接運(yùn)行在瀏覽器中,就像真正的用戶在操作一樣摧玫。
想了解selenium發(fā)展史點(diǎn)擊一下剩膘。
實(shí)例百度搜索selenium
# 導(dǎo)入webdriver類(lèi)
from selenium import Webdriver
# 調(diào)用selenium瀏覽器驅(qū)動(dòng),獲取瀏覽器句柄
driver = webdriver.Firefox()
# 通過(guò)句柄訪問(wèn)URL
first_url = 'http://www.baidu.com'
driver.get(first_url)
# 通過(guò)句柄控制頁(yè)面元素
driver.find_element_by_id("kw").send("selenium") # 在搜索框輸入selenium
driver.find_element_by_id("su").click() # 單擊百度一下
環(huán)境搭建
1.安裝python3
python下載地址:https://www.pythin.org/
2.安裝selenium
cmd命令行輸入:pip install selenium
或
cmd命令行輸入:pip install selenium=指定版本號(hào)
pip show selenium 查看當(dāng)前包的版本信息
3.安裝瀏覽器驅(qū)動(dòng)(WebDriver)
驅(qū)動(dòng)下載地址:http://www.seleniumhq.org/download/
解壓文件衅斩,將得到的.exe文件放到python目錄下
元素定位
1. id定位
通過(guò)HTML元素的ID值定位:
find_element_by_id("id名稱(chēng)")
2. name定位
通過(guò)HTML元素的name屬性值定位:
find_element_by_name("name名稱(chēng)")
3. class定位
通過(guò)HTML元素的class值定位:
find_ement_by_class_name("class名稱(chēng)")
4. tag定位
每個(gè)一個(gè)元素本質(zhì)上也是一個(gè)tag,如:<div>怠褐、<input>畏梆、<a>等
find_element_by_tag_name("input")
5. link定位
它專(zhuān)門(mén)用來(lái)定位文本鏈接:
find_element_by_link_text("鏈接名")
6. partial link定位
parial link定位是對(duì)link定位的一種補(bǔ)充,有些文本鏈接會(huì)比較長(zhǎng)奈懒,這個(gè)時(shí)候我們可以取文本鏈接的一部分定位奠涌,只要這一部分信息可以唯一地標(biāo)識(shí)這個(gè)鏈接。
find_element_by_partial_link_text("一個(gè)很長(zhǎng)的文本鏈接")
7. XPath定位
- 絕對(duì)路徑定位
find_element_by_xpath("/html/body/div/div[2]/div/div/div/from/span/input")
div[2]表示當(dāng)前層級(jí)下的第二個(gè)div標(biāo)簽 - 元素屬性定位
find_element_by_xpath("http://input[@id='id名稱(chēng)']")
find_element_by_xpath("http://input[@name='name名稱(chēng)']")
find_element_by_xpath("http://input[@class='class名稱(chēng)']")
find_element_by_xpath("http://*[@id='id名稱(chēng)']")
find_element_by_xpath("http://input[@type='submit']")
find_element_by_xpath('//p[contains(text(), "問(wèn)卷")]/a')
說(shuō)明://表示當(dāng)前頁(yè)面某個(gè)目錄下磷杏, input表示定位元素的標(biāo)簽名溜畅,[@id="id名稱(chēng)"]表示這個(gè)元素的id屬性值,如果不想指定標(biāo)簽名极祸,則可以用星號(hào)(*)代替慈格,元素的任意屬性值都可以使用,只要它能唯一的標(biāo)識(shí)一個(gè)元素遥金。 - 層級(jí)與屬性結(jié)合
如果一個(gè)元素本身沒(méi)有可以唯一標(biāo)識(shí)這個(gè)元素的屬性值浴捆,那么我們可以找其上一級(jí)元素,或上上級(jí)元素。
find_element_by_xpath("http://span[@class='class名稱(chēng)']/span/input")
- 使用邏輯運(yùn)算符
如果一個(gè)屬性不能唯一區(qū)分一個(gè)元素稿械,我們還可以使用邏輯運(yùn)算符連接多個(gè)屬性來(lái)查找元素
find_element_by_xpath("http://input[@id='值' and @class='值']/span/input")
- 通過(guò)開(kāi)發(fā)這工具(F12)定位元素復(fù)制xpath絕對(duì)路徑
8. 常用css定位
選擇器 | 例子 | 描述 |
---|---|---|
.class | .temp | class選擇器选泻,選擇class="temp"的所有元素 |
#id | #kw | id選擇器,選擇id="kw"的所有元素 |
* | * | 選擇所有元素 |
element | input | 選擇所有<input>元素 |
> | div>input | 選擇父元素為<div>的所有<input>元素美莫,父子關(guān)系 |
+ | div+input | 選擇同一級(jí)緊接在<div>元素之后的所有<input>元素 页眯,兄弟關(guān)系 |
[attrbute=value] | [type="submit"] | 選擇type="submit"的所有元素 |
9. 用By定位元素
針對(duì)前面介紹的8種定位方法,WebDriver還提供了另外一套寫(xiě)法厢呵,即統(tǒng)一調(diào)用find_element()方法
find_element()方法只用于定位元素餐茵,需要兩個(gè)參數(shù),第一個(gè)參數(shù)是定位的類(lèi)型述吸,第二個(gè)參數(shù)是定位的具體方式,在使用By之前需要導(dǎo)入By類(lèi)
# 導(dǎo)入By
from selenium.webdriver.common.by import By
# id定位
find_element(By.ID, "id值")
# name屬性定位
find_element(By.NAME, "name值")
# class屬性定位
find_element(By.CLASS_NAME, "class值")
# 標(biāo)簽定位
find_element(By.TAG_NAME, "input")
#定位鏈接
find_element(By.LINK_TEXT, "新聞")
# 定位長(zhǎng)鏈接
find_element(By.PARTIAL_LINK_TEXT, "新")
# xpath定位
find_element(By.XPATH, "http://*[@class='值']")
# css定位
find_element(By.CSS_SELECTOR, "span.class值>input#值")
10. 定位一組元素
定位一組元素的方法與定位單個(gè)元素的方法類(lèi)似,唯一的區(qū)別是在單詞element后面多加了個(gè)s表示復(fù)數(shù)蝌矛。
用于場(chǎng)景:批量操作元素道批。
例如,勾選頁(yè)面上所有的復(fù)選框入撒,先獲取一組元素隆豹,再?gòu)倪@組對(duì)象中過(guò)濾出需要操作的元素。
# 選擇頁(yè)面上所有的tag_name為input的元素
inputs=driver.find_elements_by_tag_name('input')
# 然后從中過(guò)濾出type為checkbox的元素茅逮,單擊勾選
fro input in inputs:
if input.get_attribute('type')== 'chexkbox':
input.click()
操作頁(yè)面的方法
1. 簡(jiǎn)單的元素操作
-
back()
后退 -
forward()
前進(jìn) -
refresh()
刷新(F5) -
set_window_size(480*800)
設(shè)置瀏覽器窗口大小 -
maximize_window()
全屏顯示 -
clear()
清除文本 -
send_keys("值")
模擬按鍵輸入 -
click()
單擊元素 -
submit()
用于提交表單璃赡,相當(dāng)于“回車(chē)”鍵的操作 -
quit()
關(guān)閉所有窗口 -
close()
關(guān)閉當(dāng)前窗口
2. 獲取頁(yè)面信息
-
size
返回元素的尺寸 -
text
獲取元素的文本內(nèi)容 -
get_attribute(name)
獲取屬性值 -
is_displayed
判斷元素是否可見(jiàn) (True可見(jiàn),F(xiàn)alse不可見(jiàn)) -
title
獲取當(dāng)前頁(yè)面的標(biāo)題 -
current_url
獲得當(dāng)前頁(yè)面的URL
3. 鼠標(biāo)事件
perform()
執(zhí)行所有ActionChains中存儲(chǔ)的行為献雅,可以理解成是對(duì)整個(gè)操作的提交動(dòng)作碉考。context_click()
右擊double_click()
雙擊drag_and_drop
拖動(dòng)move_to_element()
鼠標(biāo)懸停release()
在某個(gè)元素位置松開(kāi)鼠標(biāo)左鍵move_by_offset(xoffset, yoffset)
鼠標(biāo)從當(dāng)前位置移動(dòng)到某個(gè)坐標(biāo)move_to_element(to_element)
鼠標(biāo)移動(dòng)到某個(gè)元素move_to_element_with_offset(to_element, xoffset, yoffset)
移動(dòng)到距某個(gè)元素(左上角坐標(biāo))多少距離的位置
實(shí)例模擬右擊
# 導(dǎo)入提供鼠標(biāo)操作的ActionChains類(lèi)
from selenium webdriver import ActionChains
# 定位要右擊的元素
youji=driver.find_element_by_id("xx")
# 調(diào)用ActionChains()類(lèi),將瀏覽器驅(qū)動(dòng)driver作為參數(shù)傳入
# context_click()方法用于模擬鼠標(biāo)右擊操作
ActionChains(driver).context_click(youji).perform()
4. 鍵盤(pán)事件
send_keys(Keys.BACK_SPACE)
刪除鍵(BackSpace)send_keys(Keys.SPACE)
空格鍵(Space)send_keys(Keys.TAB)
制表鍵(Tab)send_keys(keys.ESCAPE)
回退鍵(Esc)send_keys(Keys.ENTER)
回車(chē)鍵(Enter)send_keys(Keys.CONTROL,'a')
全選(Ctrl+A)send_keys(Keys.CONTROL,'c')
復(fù)制(Ctrl+C)send_keys(Keys.F1)
鍵盤(pán)F1key_down(value, element=None)
按下某個(gè)鍵盤(pán)上的鍵key_up(value, element=None)
松開(kāi)某個(gè)鍵
元素定位調(diào)試
通過(guò)$()調(diào)試定位
-
通過(guò)$x()調(diào)試xpath定位
調(diào)試定位 print(driver.page_source) 打印元素內(nèi)容挺身,用于調(diào)試用