一. 安裝部署
1. 客戶端selenium庫(kù)的安裝
通過(guò)pip安裝selenium庫(kù)的命令:pip install selenium
- Selenium可支持以下幾種語(yǔ)言:java锻狗、csharp、python、ruby猬膨、php诬烹、js、perl
- 使用國(guó)內(nèi)鏡像可提升下載速度:pip install selenium -i https://pypi.douban.com/simple/
- pip安裝出現(xiàn)異常,可嘗試更新至最新版本再試沧踏,更新pip的命令:python -m pip install --upgrade pip
2. 下載對(duì)應(yīng)瀏覽器的ChromeDriver驅(qū)動(dòng):
ChromeDriver驅(qū)動(dòng)版本需與本機(jī)已安裝瀏覽器版本一致,下載前可先查看本機(jī)瀏覽器版本,然后下載正確的ChromeDriver驅(qū)動(dòng)
不清楚如何選擇對(duì)應(yīng)版本請(qǐng)點(diǎn)我
注意事項(xiàng):在使用Selenium編寫(xiě)自動(dòng)化腳本時(shí),需要調(diào)用該ChromeDriver尤泽,因此ChromeDriver驅(qū)動(dòng)存放路徑建議不要出現(xiàn)中文及空格
二.使用Selenium進(jìn)行WEB UI自動(dòng)化測(cè)試
前言
首先,我們得明白Selenium在整個(gè)WEB UI自動(dòng)化測(cè)試中所扮演的角色
- 通過(guò)ChromeDriver調(diào)用瀏覽器打開(kāi)需要測(cè)試的站點(diǎn)
- 定位要操作的元素
2.1 通過(guò)ID定位
2.2 通過(guò)class定位
2.3 通過(guò)標(biāo)簽名定位
2.4 通過(guò)xpath定位- 操作已定位到的元素
3.1 獲取頁(yè)面內(nèi)容
3.2 向選擇的元素輸入數(shù)據(jù)
3.3 點(diǎn)擊已定位元素
3.4 拖拉定位元素
- 到此處時(shí)欣簇,Selenium的使命就已經(jīng)基本完成,后面處理數(shù)據(jù)及分析數(shù)據(jù)則由python來(lái)完成坯约。
Selenium定位\操作
查找單個(gè)元素并返回元素
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://music.baidu.com/top/new')
element = driver.find_element_by_id('songListWrapper') # 根據(jù)ID查找
如果元素未找到則會(huì)拋出異常,如果結(jié)果有多個(gè),也只返回最先找到的那一個(gè)
查找多個(gè)元素并返回元素列表
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://music.baidu.com/top/new')
tip_to_taihe_box = driver.find_element_by_class_name('tipToTaihe-box') #查找單個(gè)class元素,如果存在多個(gè)只返回第一個(gè)
span_list = tip_to_taihe_box.find_elements_by_tag_name('span') #查找多個(gè)span,返回列表
如果元素未找到,會(huì)返回一個(gè)空列表(不會(huì)拋出異常)
查找元素以HTML格式字符串
強(qiáng)制等待
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://www.baidu.com')
sleep(3) # 強(qiáng)制等待3秒再執(zhí)行下一步
element = driver.find_element_by_id('kw')
注意:強(qiáng)制等待熊咽,其實(shí)就是time.sleep()方法,讓程序暫停運(yùn)行一定時(shí)間闹丐,時(shí)間過(guò)后繼續(xù)運(yùn)行横殴。缺點(diǎn):設(shè)置的時(shí)間太短,元素還沒(méi)有加載出來(lái)同樣會(huì)報(bào)錯(cuò)卿拴。設(shè)置時(shí)間太長(zhǎng)衫仑,浪費(fèi)時(shí)間,如果代碼量大了堕花,就會(huì)影響整體的運(yùn)行速度了文狱,所以盡量少用這個(gè)。
隱式等待
from selenium import webdriver
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.get('http://www.baidu.com')
driver.implicitly_wait(10) #后面的所有定位元素操作,每半秒進(jìn)行一次,直到查找到元素,最長(zhǎng)等待10秒(可自行定義)
element = driver.find_element_by_id('kw')
注意:隱式等待缘挽,是等待頁(yè)面加載瞄崇,即頁(yè)面加載完成后才能執(zhí)行后面的操作
顯式等待
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(r'd:\tools\webdriver\chromedriver.exe')
driver.implicitly_wait(10) # 隱式等待和顯性等待可以同時(shí)用,等待的最長(zhǎng)時(shí)間取兩者之中最大的
driver.get('http://www.baidu.com')
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "kw")))
finally:
driver.quit()
注意:顯式等待到踏,是等待元素加載杠袱,即元素加載完成后就執(zhí)行對(duì)該元素的操作
使用BeautifulSoup4 & html5lib 配合selenium獲取到的html內(nèi)容進(jìn)行元素定位
使用BeautifulSoup4 & html5lib前必需先通過(guò)CMD安裝這倆個(gè)庫(kù),BeautifulSoup4的具體操作窝稿,可以查看官方操作說(shuō)明文檔 ( Beautiful Soup 4.2.0 操作說(shuō)明文檔傳送門(mén) )
pip install beautifulsoup4 # 安裝BeautifulSoup4庫(kù)
pip install html5lib # 安裝html5lib庫(kù)
導(dǎo)入BeautifulSoup4 & html5lib
from bs4 import BeautifulSoup
import html5lib
Html5lib如何配合BeautifulSoup4使用
from bs4 import BeautifulSoup
import html5lib
html = """
<html>
<head><title>我喜歡的音樂(lè)</title></head>
<body>
<p class='title'><b>歌曲TOP3</b></p>
<p class='story'>以下是音樂(lè)的下載鏈接
<a class='music' id='link1'>明智之舉</a>
<a class='music' id='link2'>如約而至</a>
<a class='music' id='link3'>只要平凡</a>
這三首TOP3的歌曲你們喜歡嗎楣富?</p>
<p class='story'>...</p>
</body>
</html>
"""
soup = BeautifulSoup(html,'html5lib') # 將html5lib解釋器添加到BeautifulSoup4中
soup.title # 獲取html文檔中的title標(biāo)簽元素
soup.title.name # 獲取html文檔中的title標(biāo)簽元素的name屬性
soup.tltle.text # 獲取html文檔中的title標(biāo)簽元素的文本內(nèi)容
CSS選擇元素的方法 tag/id/class
根據(jù)tag名
p {color:red;}
根據(jù)id名
#food {color:red;}
根據(jù)class
.vergetable {color:red;}
根據(jù)tag名和class組合寫(xiě)(如果多個(gè))
span.vergetable {color:red;}
復(fù)選框選擇( SELECT )
使用SELECT時(shí)需要先導(dǎo)入庫(kù)
from selenium.webdriver.support.ui import Select
Select 模塊(index)定位
通過(guò) select 選項(xiàng)的索引來(lái)定位選擇對(duì)應(yīng)選項(xiàng)(從 0 開(kāi)始計(jì)數(shù)),如選擇第二個(gè)選項(xiàng):select_by_index(1)
<select id="cardid" name="CARD">
<option selected="" value="A">芯片卡</option>
<option value="B">磁條卡</option>
</select>
Select 模塊(value)定位
Select 模塊里面除了 index 的方法伴榔,還有一個(gè)方法纹蝴,通過(guò)選項(xiàng)的 value值來(lái)定位。每個(gè)選項(xiàng)踪少,都有對(duì)應(yīng)的 value 值:select_by_value(B)
<select id="cardid" name="CARD">
<option selected="" value="A">芯片卡</option>
<option value="B">磁條卡</option>
</select>
Select 模塊(text)定位
直接通過(guò)選項(xiàng)的文本內(nèi)容來(lái)定位塘安,定位“磁條卡”:select_by_visible_text("磁條卡")
<select id="cardid" name="CARD">
<option selected="" value="A">芯片卡</option>
<option value="B">磁條卡</option>
</select>
# 導(dǎo)入Select庫(kù)
from selenium.webdriver.support.ui import Select
# 獲取select父元素
s= driver.find_element_by_id('cardid')
# 取消全部選擇
select.deselect_all()
# 選擇指定文本內(nèi)容的復(fù)選框
select(s).select_by_index(1) #通過(guò)index定位并選擇
select(s).select_by_value(B) #通過(guò)value定位并選擇
select(s).select_by_visible_text('磁條卡') #通過(guò)text定位并選擇
select 里面方法除了上面介紹的三種,還有更多的功能如下
select_by_index() :通過(guò)索引定位
select_by_value() :通過(guò) value 值定位
select_by_visible_text() :通過(guò)文本值定位
deselect_all() :取消所有選項(xiàng)
deselect_by_index() :取消對(duì)應(yīng) index 選項(xiàng)
deselect_by_value() :取消對(duì)應(yīng) value 選項(xiàng)
deselect_by_visible_text() :取消對(duì)應(yīng)文本選項(xiàng)
first_selected_option() :返回第一個(gè)選項(xiàng)
all_selected_options() :返回所有的選項(xiàng)
XPath 定位元素方法
特殊定位方法
driver.find_element_by_xpath("http://span[contains(text(),'hello')]") """text值包含匹配"""
driver.find_element_by_xpath("http://span[text()='新聞']") """text值絕對(duì)匹配"""
更多查看:XPath 語(yǔ)法參考手冊(cè)
selenium使用XPath方法定位元素from selenium import webdriver driver = webdriver.Chrome(r'd:\tools\chromedriver.exe') one_element = driver.find_element_by_xpath('//div[@id="myid"]') # 單個(gè)定位 element_list = driver.find_elements_by_xpath('//div[@class="myclass"]') # 多個(gè)定位(復(fù)數(shù)形式,返回列表)
end