自己的電腦做服務(wù)器建立網(wǎng)站的方法百度競(jìng)價(jià)搜索
Selenium是一套web網(wǎng)站的程序自動(dòng)化操作解決方案。我們通過編寫自動(dòng)化程序,使得自動(dòng)完成瀏覽器界面的相關(guān)操作,除了能夠自動(dòng)化的完成相關(guān)操作,還能從web頁(yè)面獲取相關(guān)信息,然后通過程序進(jìn)行分析處理,本質(zhì)上就是提升從網(wǎng)頁(yè)上輸入和獲取信息的能力 。
目錄
一、selenium原理
二、selenium自動(dòng)化環(huán)境搭建
2.1、pip安裝
2.2、 安裝Selenium客戶端庫(kù)
2.3、安裝瀏覽器和瀏覽器驅(qū)動(dòng)?
2.4、安裝python環(huán)境與pychram集成開發(fā)環(huán)境
三、選擇元素的基本方法
3.1、自動(dòng)化腳本打開瀏覽器對(duì)應(yīng)url
3.2、選擇元素
3.2.1、根據(jù)元素id選擇元素
3.2.2、根據(jù)class和tag屬性選擇元素
3.2.3、隱式等待
3.2.4、操縱元素
四、CSS表達(dá)式
4.1、css選擇器
4.2、驗(yàn)證css選擇器
?4.3、css組選擇
4.4、css選擇器按次序選擇
4.5、frame切換
4.6、瀏覽器窗口切換
4.7、mac selenium腳本啟動(dòng)打開已有瀏覽器
五、選擇框
5.1、radio框
5.2、checkbox框
5.3、select選擇框
六、Selenium實(shí)戰(zhàn)技巧
6.1、ActionChains模擬鼠標(biāo)操作
6.2、凍結(jié)頁(yè)面
6.3、彈出框處理
6.3.1、Alert 彈出框
6.3.2、Confirm彈出框
6.3.3、Prompt 彈出框
七、Xpath選擇器
7.1、絕對(duì)路徑選擇器
7.2、相對(duì)路徑選擇器
7.3、屬性選擇
7.4、按次序選擇
7.5、組選擇、父節(jié)點(diǎn)、兄弟節(jié)點(diǎn)
可以參考這個(gè)網(wǎng)站:www.byhy.net
一、selenium原理
selenium通過自動(dòng)化腳本控制瀏覽器驅(qū)動(dòng),瀏覽器驅(qū)動(dòng)控制瀏覽器,進(jìn)而完成相應(yīng)的自動(dòng)化測(cè)試,整體來(lái)說就是程序控制。
二、selenium自動(dòng)化環(huán)境搭建
2.1、pip安裝
首先先下載pip,我用的mac本,在終端輸入以下語(yǔ)句,因?yàn)楹竺嬉迷撁钸M(jìn)行安裝。
curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py
sudo python3 get-pip.py
安裝成功,但是有warning,需要將其添加到path,將你的黃色警告的文件目錄部分更換下面PATH=后的目錄部分。
echo 'export PATH=/Users/hb24760/Library/Caches/pip:$PATH' >>~/.bashrc
?輸入指令是的文件生效,并驗(yàn)證pip是否安裝成功。
source ~/.bashrc
pip -V
pip安裝成功。
2.2、 安裝Selenium客戶端庫(kù)
首先使用pip指令安裝,在命令終端輸入如下命令。
pip install selenium -i https://pypi.douban.com/simple/
安裝成功,如下。
2.3、安裝瀏覽器和瀏覽器驅(qū)動(dòng)?
瀏覽器首先chrome,正常下載安裝就行了,這里不在贅述。
我們看一下如何安裝瀏覽器驅(qū)動(dòng),首先看一下瀏覽器的版本,瀏覽器驅(qū)動(dòng)的版本要和瀏覽器版本一致才可以。我的瀏覽器版本是114.
在下面的瀏覽器驅(qū)動(dòng)地址中,選擇114版本的chrome驅(qū)動(dòng)進(jìn)行安裝就可以了,可以發(fā)現(xiàn)mac有兩個(gè)版本,我是intel的,所以選上面的。
https://chromedriver.storage.googleapis.com/index.html?
2.4、安裝python環(huán)境與pychram集成開發(fā)環(huán)境
我是mac本,具體參考這個(gè)鏈接進(jìn)行安裝就可以了,我這邊不再贅述,鏈接如下:
Mac安裝python 環(huán)境& pycharm_mac pycharm 安裝_程序員雷子的博客-CSDN博客
三、選擇元素的基本方法
3.1、自動(dòng)化腳本打開瀏覽器對(duì)應(yīng)url
使用如下腳本可以自動(dòng)打開chrome瀏覽器并打開百度的官網(wǎng)。
from selenium import webdriver# 創(chuàng)建 WebDriver 對(duì)象,指明使用chrome瀏覽器驅(qū)動(dòng)
# 這里現(xiàn)在可以指定路徑,會(huì)自動(dòng)尋找電腦上的chrome驅(qū)動(dòng)
wd = webdriver.Chrome()# 調(diào)用WebDriver 對(duì)象的get方法 可以讓瀏覽器打開指定網(wǎng)址
wd.get('https://www.baidu.com')
3.2、選擇元素
3.2.1、根據(jù)元素id選擇元素
首先我們看一下根據(jù)元素id屬性值選擇元素,根據(jù)開發(fā)規(guī)范,正常一個(gè)HTML頁(yè)面的元素id是唯一的,所以根據(jù)id尋找元素是很高效的。下面是根據(jù)元素id選擇元素搜索框,然后輸入通訊,然后根據(jù)id選擇元素按鈕,點(diǎn)擊查詢。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException# 創(chuàng)建 WebDriver 對(duì)象
wd = webdriver.Chrome()# 調(diào)用WebDriver 對(duì)象的get方法 可以讓瀏覽器打開指定網(wǎng)址
wd.get('https://www.byhy.net/_files/stock1.html')# 根據(jù)id選擇元素,返回的就是該元素對(duì)應(yīng)的WebElement對(duì)象
try:# 找到id為kw的元素并鍵入“通訊”element = wd.find_element(By.ID, 'kw')element.send_keys('通訊')# 通過該 WebElement對(duì)象,就可以對(duì)頁(yè)面元素進(jìn)行操作了# 比如輸入字符串到 這個(gè) 輸入框里 并按回車鍵# element.send_keys('通訊\n')# 找到id為go的按鈕元素,并點(diǎn)擊element = wd.find_element(By.ID, 'go')element.click()
except NoSuchElementException:print('元素id不存在!!!')
演示效果圖如下:
3.2.2、根據(jù)class和tag屬性選擇元素
下面根據(jù)屬性class和tag尋找元素,如下所示。
from selenium.common.exceptions import NoSuchElementException
from selenium import webdriver
from selenium.webdriver.common.by import By# 創(chuàng)建 WebDriver 實(shí)例對(duì)象,指明使用chrome瀏覽器驅(qū)動(dòng)
wd = webdriver.Chrome()# WebDriver 實(shí)例對(duì)象的get方法 可以讓瀏覽器打開指定網(wǎng)址
wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')# 根據(jù) class name 選擇元素,返回的是 一個(gè)列表
# 里面 都是class 屬性值為 animal的元素對(duì)應(yīng)的 WebElement對(duì)象
try:elements = wd.find_elements(By.CLASS_NAME, 'animal')# 取出列表中的每個(gè) WebElement對(duì)象,打印出其text屬性的值# text屬性就是該 WebElement對(duì)象對(duì)應(yīng)的元素在網(wǎng)頁(yè)中的文本內(nèi)容for element in elements:print(element.text)
except NoSuchElementException:print("元素不存在!!!")try:# wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')# 根據(jù) tag name 選擇元素,返回的是 一個(gè)列表# 里面 都是 tag 名為 div 的元素對(duì)應(yīng)的 WebElement對(duì)象elements = wd.find_elements(By.TAG_NAME, 'div')# 取出列表中的每個(gè) WebElement對(duì)象,打印出其text屬性的值# text屬性就是該 WebElement對(duì)象對(duì)應(yīng)的元素在網(wǎng)頁(yè)中的文本內(nèi)容for element in elements:print(element.text)
except NoSuchElementException:print("元素不存在!!!")
3.2.3、隱式等待
Selenium 的 Webdriver 對(duì)象 有個(gè)方法叫??implicitly_wait
?,可以稱之為??隱式等待
?,或者?全局等待
?。該方法接受一個(gè)參數(shù), 用來(lái)指定最大等待時(shí)長(zhǎng)。下面通過打開網(wǎng)頁(yè),選擇元素kw,輸入通訊并回車,將查詢出的id為1的元素取出來(lái)。
from selenium import webdriver
from selenium.webdriver.common.by import By# 創(chuàng)建 WebDriver 實(shí)例對(duì)象,指明使用chrome瀏覽器驅(qū)動(dòng)
wd = webdriver.Chrome()
# 設(shè)置查找不到元素等待時(shí)間
wd.implicitly_wait(10)wd.get('https://www.byhy.net/_files/stock1.html')element = wd.find_element(By.ID, 'kw')element.send_keys('通訊\n')# 返回頁(yè)面 ID為1 的元素
element = wd.find_element(By.ID,'1')
3.2.4、操縱元素
我們?nèi)绻肭蹇蛰斎肟?#xff0c;需要用clear方法,find_element方法可以根據(jù)屬性尋找元素,get_attribute方法可以得到元素里面的屬性。
from selenium import webdriver
from selenium.webdriver.common.by import By# 創(chuàng)建 WebDriver 實(shí)例對(duì)象,指明使用chrome瀏覽器驅(qū)動(dòng)
wd = webdriver.Chrome()
# 設(shè)置查找不到元素等待時(shí)間
wd.implicitly_wait(10)wd.get('https://www.byhy.net/_files/stock1.html')element = wd.find_element(By.ID, 'kw')element.send_keys('通訊\n')# 清除輸入框已有的字符串
element.clear()
# 輸入新字符串
element.send_keys('科技')
# 除了上面的find_elements外,也可以使用et_attribute獲取元素
value = element.get_attribute('value')
element = wd.find_element(By.CLASS_NAME, 'name')
innerText = element.get_attribute('innerText')
outerHTML = element.get_attribute('outerHTML')
innerHTML = element.get_attribute('innerHTML')print(value)
print(innerText)
print(outerHTML)
print(innerText)
四、CSS表達(dá)式
4.1、css選擇器
如果我們要選擇的 元素 沒有id、class 屬性,或者有些我們不想選擇的元素 也有相同的 id、class屬性值,怎么辦呢?這時(shí)候我們通??梢酝ㄟ^??CSS selector
?語(yǔ)法選擇元素。
比如,我們想在??id 為 searchtext
?的輸入框中輸入文本??你好。
根據(jù)class屬性 選擇元素的語(yǔ)法是在 class 值 前面加上一個(gè)點(diǎn):?.class值
選擇元素的直接子元素:
元素1 > 元素2 > 元素3 > 元素4
選擇元素的后代元素:元素1 ??元素2?
from selenium import webdriver
from selenium.webdriver.common.by import Bywd = webdriver.Chrome()
wd.implicitly_wait(10)wd.get('https://cdn2.byhy.net/files/selenium/sample1.html')# 根據(jù)CSS選擇器選擇id為searchtext的輸入框,并鍵入你好
element = wd.find_element(By.CSS_SELECTOR, '#searchtext')
element.send_keys('你好')wd.get('http://f.python3.vip/webauto/sample1.html')
# 選擇id為top的非直接子元素為id是body,直接子元素class為container的
element = wd.find_element(By.CSS_SELECTOR, '#top #body > .container')
print(element.text)
當(dāng)然,也可以根據(jù)通過css選擇器,通過屬性選擇,如下所示。
from selenium import webdriver
from selenium.webdriver.common.by import Bywd = webdriver.Chrome()
wd.implicitly_wait(10)wd.get('http://f.python3.vip/webauto/sample1.html')# 根據(jù)屬性選擇元素
element = wd.find_element(By.CSS_SELECTOR, '[href="https://beian.miit.gov.cn/"]')
print(element.text)
4.2、驗(yàn)證css選擇器
我們可以在開發(fā)者環(huán)境,驗(yàn)證網(wǎng)頁(yè)的css表達(dá)式是否有效,有效的表達(dá)式,我們才寫到程序里面,這樣可以避免程序bug。
按住ctr+f鍵盤,在如下彈出的輸入框輸入表達(dá)式,就可以驗(yàn)證css選擇器的表達(dá)式是否合法。
?4.3、css組選擇
如果我們要 同時(shí)選擇所有class 為 plant??和
?class 為 animal 的元素。怎么辦?
這種情況,css選擇器可以 使用?逗號(hào)
?,稱之為 組選擇 ,像這樣
.plant , .animal
選擇所有 id 為 t1 里面的??span 和 p 元素
,需要寫兩遍#t1,如下:
#t1 > span , #t1 > p
4.4、css選擇器按次序選擇
我們可以指定選擇的元素??是父元素的第幾個(gè)子節(jié)點(diǎn)
,使用??nth-child,
也就是說 選擇的是 第2個(gè)子元素,并且是span類型,所以這樣可以這樣寫?span:nth-child(2)
如果你不加節(jié)點(diǎn)類型限制,直接這樣寫??:nth-child(2),
就是選擇所有位置為第2個(gè)的所有元素,不管是什么類型。
也可以反過來(lái), 選擇的是父元素的?倒數(shù)第幾個(gè)子節(jié)點(diǎn)
?,使用??nth-last-child
,比如:
p:nth-last-child(1)
我們可以指定選擇的元素 是父元素的第幾個(gè)?某類型的
?子節(jié)點(diǎn),使用??nth-of-type。
還可以這樣思考,選擇的是??第1個(gè)span類型
?的子元素,所以也可以這樣寫?span:nth-of-type(1)
當(dāng)然也可以反過來(lái), 選擇父元素的?倒數(shù)第幾個(gè)某類型
?的子節(jié)點(diǎn),使用??nth-last-of-type
p:nth-last-of-type(2)
如果要選擇的是父元素的?偶數(shù)節(jié)點(diǎn)
,使用??nth-child(even)
,比如:
p:nth-child(even)
如果要選擇的是父元素的?奇數(shù)節(jié)點(diǎn)
,使用??nth-child(odd)
p:nth-child(odd)
如果要選擇的是父元素的?某類型偶數(shù)節(jié)點(diǎn)
,使用??nth-of-type(even)
如果要選擇的是父元素的?某類型奇數(shù)節(jié)點(diǎn)
,使用??nth-of-type(odd)
選擇 h3??后面緊跟著的兄弟節(jié)點(diǎn)
?span。這就是一種 相鄰兄弟 關(guān)系,可以這樣寫??h3 + span
表示元素 緊跟關(guān)系的 是??加號(hào),
如果要選擇是 選擇 h3??后面所有的兄弟節(jié)點(diǎn)
?span,可以這樣寫??h3 ~ span
4.5、
frame切換
我們使用switch指令可以實(shí)現(xiàn)frame的切入和切出,具體如下。
from selenium import webdriver
from selenium.webdriver.common.by import Bywd = webdriver.Chrome()wd.get('https://cdn2.byhy.net/files/selenium/sample2.html')# 切換到frame
'''
wd.switch_to.frame('frame1')
wd.switch_to.frame('innerFrame')
'''
wd.switch_to.frame(wd.find_element(By.TAG_NAME, "iframe"))# 根據(jù) class name 選擇元素,返回的是 一個(gè)列表
elements = wd.find_elements(By.CLASS_NAME, 'plant')for element in elements:print(element.text)# 再切回到html中
wd.switch_to.default_content()
# 然后再 選擇操作 外部的 HTML 中 的元素
wd.find_element(By.ID,'outerbutton').click()
4.6、瀏覽器窗口
切換
我們依次獲取 wd.window_handles 里面的所有 句柄 對(duì)象, 并且調(diào)用 wd.switch_to.window(handle) 方法,切入到每個(gè)窗口,然后檢查里面該窗口對(duì)象的屬性(可以是標(biāo)題欄,地址欄),判斷是不是我們要操作的那個(gè)窗口,如果是,就跳出循環(huán)。
因?yàn)槲覀円婚_始就在 原來(lái)的窗口里面,我們知道 進(jìn)入新窗口操作完后,還要回來(lái),可以事先 保存該老窗口的 句柄,使用如下方法。
# mainWindow變量保存當(dāng)前窗口的句柄
mainWindow = wd.current_window_handle
切換到新窗口操作完后,就可以直接像下面這樣,將driver對(duì)應(yīng)的對(duì)象返回到原來(lái)的窗口。
#通過前面保存的老窗口的句柄,自己切換到老窗口
wd.switch_to.window(mainWindow)
from selenium import webdriver
from selenium.webdriver.common.by import Bywd = webdriver.Chrome()
wd.implicitly_wait(10)wd.get('https://cdn2.byhy.net/files/selenium/sample3.html')# mainWindow變量保存當(dāng)前窗口的句柄
mainWindow = wd.current_window_handle# 點(diǎn)擊打開新窗口的鏈接
link = wd.find_element(By.TAG_NAME, "a")
link.click()for handle in wd.window_handles:# 先切換到該窗口wd.switch_to.window(handle)# 得到該窗口的標(biāo)題欄字符串,判斷是不是我們要操作的那個(gè)窗口if 'Bing' in wd.title:# 如果是,那么這時(shí)候WebDriver對(duì)象就是對(duì)應(yīng)的該該窗口,正好,跳出循環(huán),break# wd.title屬性是當(dāng)前窗口的標(biāo)題欄 文本
print(wd.title)# 通過前面保存的老窗口的句柄,自己切換到老窗口
wd.switch_to.window(mainWindow)
4.7、mac selenium腳本啟動(dòng)打開已有瀏覽器
首先編輯~/.zshrc添加環(huán)境變量,并使其生效,終端鍵入:
export PATH="/Applications/Google Chrome.app/Contents/MacOS:$PATH"
source ~/.zshrc
終端執(zhí)行命令打開google瀏覽器,如下:
Google\ Chrome --remote-debugging-port=9222 --user-data-dir="~/ChromeProfile"
我們可以先登陸好某個(gè)網(wǎng)站,下次就可以避免登陸校驗(yàn)了。
from selenium import webdriveroptions = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")browser = webdriver.Chrome(options=options)url = 'http://fat-hms.hellobike.cn/#/resource/theme'
browser.get(url)
五、選擇框
5.1、radio框
radio框選擇選項(xiàng),直接用WebElement的click方法,模擬用戶點(diǎn)擊就可以了。
其中??#s_radio input[name="teacher"]:checked
?里面的??:checked
?是CSS偽類選擇
表示選擇?checked
?狀態(tài)的元素,對(duì)?radio
?和?checkbox
?類型的input有效
# 獲取當(dāng)前選中的元素
element = wd.find_element(By.CSS_SELECTOR, '#s_radio input[name="teacher"]:checked')
print('當(dāng)前選中的是: ' + element.get_attribute('value'))# 點(diǎn)選 小雷老師
wd.find_element(By.CSS_SELECTOR, '#s_radio input[value="小雷老師"]').click()
5.2、checkbox框
對(duì)checkbox進(jìn)行選擇,也是直接用 WebElement 的 click 方法,模擬用戶點(diǎn)擊選擇。
需要注意的是,要選中checkbox的一個(gè)選項(xiàng),必須?先獲取當(dāng)前該復(fù)選框的狀態(tài)
?,如果該選項(xiàng)已經(jīng)勾選了,就不能再點(diǎn)擊。否則反而會(huì)取消選擇。
我們的思路可以是這樣:
- 先把 已經(jīng)選中的選項(xiàng)全部點(diǎn)擊一下,確保都是未選狀態(tài)
- 再點(diǎn)擊 要選擇的
# 先把 已經(jīng)選中的選項(xiàng)全部點(diǎn)擊一下
elements = wd.find_elements(By.CSS_SELECTOR, '#s_checkbox input[name="teacher"]:checked')for element in elements:element.click()# 再點(diǎn)擊 小雷老師
wd.find_element(By.CSS_SELECTOR, "#s_checkbox input[value='小雷老師']").click()
5.3、select選擇框
對(duì)于Select 選擇框, Selenium 專門提供了一個(gè)?Select類
?進(jìn)行操作。
對(duì)于 select單選框,操作比較簡(jiǎn)單:不管原來(lái)選的是什么,直接用Select方法選擇即可。
# 導(dǎo)入Select類
from selenium.webdriver.support.ui import Select# 創(chuàng)建Select對(duì)象
select = Select(wd.find_element(By.ID, "ss_single"))# 通過 Select 對(duì)象選中小雷老師
select.select_by_visible_text("小雷老師")
對(duì)于select多選框,要選中某幾個(gè)選項(xiàng),要注意去掉原來(lái)已經(jīng)選中的選項(xiàng)。
可以用select類 的deselect_all方法,清除所有 已經(jīng)選中 的選項(xiàng),然后再通過 select_by_visible_text方法 選擇需要選擇的。
# 導(dǎo)入Select類
from selenium.webdriver.support.ui import Select# 創(chuàng)建Select對(duì)象
select = Select(wd.find_element(By.ID, "ss_multi"))# 清除所有 已經(jīng)選中 的選項(xiàng)
select.deselect_all()# 選擇小雷老師 和 小凱老師
select.select_by_visible_text("小雷老師")
select.select_by_visible_text("小凱老師")
六、Selenium實(shí)戰(zhàn)技巧
6.1、ActionChains模擬鼠標(biāo)操作
之前我們對(duì)web元素做的操作主要是:選擇元素,然后?點(diǎn)擊元素?或者?輸入?字符串。除了這些寫常見的操作,還有其他操作,比如 鼠標(biāo)右鍵點(diǎn)擊、雙擊、移動(dòng)鼠標(biāo)到某個(gè)元素、鼠標(biāo)拖拽等。
這些操作,可以通過 Selenium 提供的??ActionChains
?類來(lái)實(shí)現(xiàn)。ActionChains 類 里面提供了 一些特殊的動(dòng)作的模擬,我們可以通過 ActionChains 類的代碼查看到。
使用 ActionChains 來(lái) 模擬鼠標(biāo)移動(dòng) 操作的代碼如下:
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.implicitly_wait(5)driver.get('https://www.baidu.com/')from selenium.webdriver.common.action_chains import ActionChainsac = ActionChains(driver)# 鼠標(biāo)移動(dòng)到 元素上
ac.move_to_element(driver.find_element(By.CSS_SELECTOR, '[name="tj_briicon"]')
).perform()
6.2、凍結(jié)頁(yè)面
有些網(wǎng)站上面的元素, 我們鼠標(biāo)放在上面,會(huì)動(dòng)態(tài)彈出一些內(nèi)容。但是 當(dāng)我們的鼠標(biāo) 從 圖標(biāo) 移開, 這個(gè) 欄目就整個(gè)消失了, 就沒法 查看 其對(duì)應(yīng)的 HTML。
在 開發(fā)者工具欄 console 里面執(zhí)行如下js代碼
setTimeout(function(){debugger}, 5000)
表示在 5000毫秒后,執(zhí)行 debugger 命令,執(zhí)行該命令會(huì) 瀏覽器會(huì)進(jìn)入debug狀態(tài)。 debug狀態(tài)有個(gè)特性, 界面被凍住, 不管我們?cè)趺袋c(diǎn)擊界面都不會(huì)觸發(fā)事件。
6.3、彈出框處理
6.3.1、Alert 彈出框
Alert 彈出框,目的就是顯示通知信息,只需用戶看完信息后,點(diǎn)擊 OK(確定) 就可以了。
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://cdn2.byhy.net/files/selenium/test4.html')# --- alert ---
driver.find_element(By.ID, 'b1').click()# 打印 彈出框 提示信息
print(driver.switch_to.alert.text) # 點(diǎn)擊 OK 按鈕
driver.switch_to.alert.accept()
6.3.2、Confirm彈出框
Confirm彈出框,主要是讓用戶確認(rèn)是否要進(jìn)行某個(gè)操作。比如:當(dāng)管理員在網(wǎng)站上選擇刪除某個(gè)賬號(hào)時(shí),就可能會(huì)彈出 Confirm彈出框, 要求確認(rèn)是否確定要?jiǎng)h除。Confirm彈出框 有兩個(gè)選擇供用戶選擇,分別是 OK 和Cancel,?分別代表 確定 和 取消 操作。
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.implicitly_wait(5)driver.get('https://cdn2.byhy.net/files/selenium/test4.html')# --- confirm ---
driver.find_element(By.ID, 'b2').click()# 打印 彈出框 提示信息
print(driver.switch_to.alert.text)# 點(diǎn)擊 OK 按鈕
driver.switch_to.alert.accept()driver.find_element(By.ID, 'b2').click()# 點(diǎn)擊 取消 按鈕
driver.switch_to.alert.dismiss()
6.3.3、Prompt 彈出框
出現(xiàn) Prompt 彈出框 是需要用戶輸入一些信息,提交上去。這邊的彈出框都不是HTLML,要是HTML可以直接獲取元素進(jìn)行操作。
from selenium import webdriver
from selenium.webdriver.common.by import Bydriver = webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://cdn2.byhy.net/files/selenium/test4.html')# --- prompt ---
driver.find_element(By.ID, 'b3').click()# 獲取 alert 對(duì)象
alert = driver.switch_to.alert# 打印 彈出框 提示信息
print(alert.text)# 輸入信息,并且點(diǎn)擊 OK 按鈕 提交
alert.send_keys('web自動(dòng)化 - selenium')
alert.accept()# 點(diǎn)擊 Cancel 按鈕 取消
driver.find_element(By.ID, 'b3').click()
alert = driver.switch_to.alert
alert.dismiss()
七、Xpath選擇器
還有一種 靈活、強(qiáng)大 的選擇元素的方式,就是使用??Xpath
?表達(dá)式。XPath (XML Path Language) 是由國(guó)際標(biāo)準(zhǔn)化組織W3C指定的,用來(lái)在 XML 和 HTML 文檔中選擇節(jié)點(diǎn)的語(yǔ)言。
7.1、絕對(duì)路徑選擇器
從根節(jié)點(diǎn)開始的,到某個(gè)節(jié)點(diǎn),每層都依次寫下來(lái),每層之間用??/
?分隔的表達(dá)式,就是某元素的??絕對(duì)路徑。
上面的xpath表達(dá)式?/html/body/div
?,就是一個(gè)絕對(duì)路徑的xpath表達(dá)式, 等價(jià)于 css表達(dá)式?html>body>div
自動(dòng)化程序要使用Xpath來(lái)選擇web元素,應(yīng)該調(diào)用 WebDriver對(duì)象的方法?find_element_by_xpath
?或者?find_elements_by_xpath
,像這樣:
elements = driver.find_elements(By.XPATH, "/html/body/div")
7.2、相對(duì)路徑選擇器
我們需要選擇網(wǎng)頁(yè)中某個(gè)元素,?不管它在什么位置
?。比如,選擇示例頁(yè)面的所有標(biāo)簽名為?div
?的元素,如果使用css表達(dá)式,直接寫一個(gè)?div
?就行了。
?xpath需要前面加?//
?, 表示從當(dāng)前節(jié)點(diǎn)往下尋找所有的后代元素,不管它在什么位置。所以xpath表達(dá)式,應(yīng)該這樣寫:??//div
‘//’ 符號(hào)也可以繼續(xù)加在后面,比如,要選擇 所有的 div 元素里面的 所有的 p 元素 ,不管div 在什么位置,也不管p元素在div下面的什么位置,則可以這樣寫?//div//p
對(duì)應(yīng)的自動(dòng)化程序如下:
elements = driver.find_elements(By.XPATH, "//div//p")
如果使用CSS選擇器,對(duì)應(yīng)代碼如下:
elements = driver.find_elements(By.CSS_SELECTOR,"div p")
如果,要選擇 所有的 div 元素里面的 直接子節(jié)點(diǎn) p , xpath,就應(yīng)該這樣寫了??//div/p
如果使用CSS選擇器,則為??div > p
通配符
如果要選擇所有div節(jié)點(diǎn)的所有直接子節(jié)點(diǎn),可以使用表達(dá)式?//div/*
*
?是一個(gè)通配符,對(duì)應(yīng)任意節(jié)點(diǎn)名的元素,等價(jià)于CSS選擇器??div > *
代碼如下:
elements = driver.find_elements(By.XPATH, "//div/*")
for element in elements:print(element.get_attribute('outerHTML'))
7.3、屬性選擇
Xpath 可以根據(jù)屬性來(lái)選擇元素。
根據(jù)屬性來(lái)選擇元素 是通過 這種格式來(lái)的??[@屬性名='屬性值']
注意:屬性名注意前面有個(gè)@,屬性值一定要用引號(hào), 可以是單引號(hào),也可以是雙引號(hào)
選擇 id 為 west 的元素,可以這樣??//*[@id='west']
選擇所有 select 元素中 class為 single_choice 的元素,可以這樣?//select[@class='single_choice']???????
同樣的道理,我們也可以利用其它的屬性選擇
比如選擇 具有multiple屬性的所有頁(yè)面元素 ,可以這樣??//*[@multiple]
要選擇 style屬性值 包含 color 字符串的 頁(yè)面元素 ,可以這樣??//*[contains(@style,'color')]
要選擇 style屬性值 以 color 字符串??開頭
?的 頁(yè)面元素 ,可以這樣??//*[starts-with(@style,'color')]
7.4、按次序選擇
和CSS選擇器類似,具體參考這個(gè)網(wǎng)站:Xpath選擇器 | 白月黑羽
7.5、組選擇、父節(jié)點(diǎn)、兄弟節(jié)點(diǎn)
和CSS選擇器類似,具體參考這個(gè)網(wǎng)站:Xpath選擇器 | 白月黑羽?