亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于python的selenium全網(wǎng)最新超詳細(xì)教程

 更新時(shí)間:2023年12月27日 09:56:13   作者:允歆辰丶  
這篇文章主要介紹了基于python的selenium全網(wǎng)最新超詳細(xì)教程,本文內(nèi)容比較長,結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下

一.安裝

安裝WebDriver

查看chrome版本號,設(shè)置-幫助-關(guān)于Google chrome,找到版本號。

可以到這個(gè)網(wǎng)站進(jìn)行下載對應(yīng)版本的chromedriver,如果chrome瀏覽器版本過高,可以下載最新版的chromedriver進(jìn)行使用 Chrome for Testing availability

下載下來之后,將chromedriver.exe放到安裝的Python環(huán)境的文件夾內(nèi) 

 終端輸入chromedriver -version驗(yàn)證

必要的話,可以重啟電腦,可能進(jìn)行編寫完代碼進(jìn)行啟動(dòng)的過程很慢,可以耐心等待一段時(shí)間,基本上都是可以運(yùn)行的

二.源碼分析

  • 首先啟動(dòng)WebDriver并綁定特定端口開啟Web服務(wù),當(dāng)作Remote Server
  • Client 首次請求會創(chuàng)建1個(gè)Session,向remote server發(fā)送HTTP請求啟動(dòng)瀏覽器,Remote Server解析請求,完成相應(yīng)操作并返回response
  • 啟動(dòng)瀏覽器后,Client Cookie攜帶session id,再次給Remote Server發(fā)送HTTP請求操作瀏覽器,定位頁面元素等等
  • 解析response,判斷腳本是否繼續(xù)還是結(jié)束

三.webdriver操作方法

1.元素操作

click()點(diǎn)擊事件   clear()清空事件   send_keys()輸入事件

拿百度舉例,我們可以現(xiàn)在搜索輸入框中清空數(shù)據(jù)(clear),然后輸入數(shù)據(jù)(send_keys),最后點(diǎn)擊按鈕進(jìn)行跳轉(zhuǎn)(click) 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://www.baidu.com/")
    driver.find_element(By.ID,'kw').clear()
    driver.find_element(By.ID, 'kw').send_keys('zxn')
    driver.find_element(By.ID,'su').click()
    time.sleep(2)
    driver.close()

2.瀏覽器操作

1. maximize_window()      最大化瀏覽器窗口-->模擬瀏覽器最大化按鈕
2. set_window_size(width,height)  設(shè)置瀏覽器窗口大小-->設(shè)置瀏覽器寬、高(像素點(diǎn))
3. set_window_position(x, y)    設(shè)置瀏覽器窗口位置-->設(shè)置瀏覽器位置
4. back()    后退-->模擬瀏覽器后退按鈕
5. forward()    前進(jìn)-->模擬瀏覽器前進(jìn)按鈕
6. refresh()    刷新-->模擬瀏覽器F5刷新
7. close()    關(guān)閉當(dāng)前窗口-->模擬點(diǎn)擊瀏覽器關(guān)閉按鈕
8. quit()     關(guān)閉瀏覽器驅(qū)動(dòng)對象-->關(guān)閉所有程序啟動(dòng)的窗口
9. title        獲取頁面title
10. current_url   獲取當(dāng)前頁面URL

可以根據(jù)以下的代碼進(jìn)行理解 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    driver.find_element(By.ID,'kw').clear()
    driver.find_element(By.ID, 'kw').send_keys('zxn')
    driver.find_element(By.ID,'su').click()
    time.sleep(2)
    driver.back()
    time.sleep(2)
    driver.forward()
    time.sleep(2)
    driver.refresh()
    time.sleep(2)
    driver.close()

close()    關(guān)閉當(dāng)前窗口-->模擬點(diǎn)擊瀏覽器關(guān)閉按鈕   關(guān)閉單個(gè)頁面

注意:當(dāng)打開新的頁面時(shí),close方法關(guān)閉的是原頁面

比如下面的代碼,打開了百度的頁面,之后點(diǎn)擊百度地圖頁面,打開了一個(gè)新的標(biāo)簽頁,close方法關(guān)閉了百度頁面,而,百度地圖頁面并沒有被關(guān)閉

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ]').click()
    time.sleep(2)
    driver.close()
    time.sleep(2)

quit()     關(guān)閉瀏覽器驅(qū)動(dòng)對象-->關(guān)閉所有程序啟動(dòng)的窗口  #關(guān)閉所有的頁面

webdriver的屬性:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    print(driver.title)
    print(driver.current_url)

3.獲取元素信息

1. size       返回元素大小
2. text        獲取元素的文本
3. get_attribute( "xxx")     獲取屬性值,傳遞的參數(shù)為元素的屬性名

4. is_displayed()              判斷元素是否可見
5. is_enabled()                判斷元素是否可用
6. is_selected()                判斷元素是否選中,用來檢查復(fù)選框或單選按鈕是否被選中

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    print(driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ]').size)
    print(driver.find_element(By.CSS_SELECTOR, 'a[ rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ]').text)
    print(driver.find_element(By.CSS_SELECTOR, 'a[ rel="external nofollow"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" ]').get_attribute('href'))
    driver.quit()

4.鼠標(biāo)操作

常見的鼠標(biāo)操作有:點(diǎn)擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標(biāo)操作Selenium都封裝了相應(yīng)的操作方法。

說明:在Selenium中將操作鼠標(biāo)的方法封裝在ActionChains類中
實(shí)例化對象:
action =ActionChains(driver)方法:
1. context_click(element)                 右擊-->模擬鼠標(biāo)右鍵點(diǎn)擊效果
2. double_click(element)                 雙擊--〉模擬鼠標(biāo)雙擊效果
3. drag_and_drop(source,target)    拖動(dòng)--〉模擬鼠標(biāo)拖動(dòng)效果

4. move_to_element(element)        懸停-->模擬鼠標(biāo)懸停效果
5. perform()         執(zhí)行-->此方法用來執(zhí)行以上所有鼠標(biāo)操作
為了更好的學(xué)習(xí)其他方法,我們先學(xué)習(xí)perform()執(zhí)行方法,因?yàn)樗械姆椒ǘ夹枰獔?zhí)行才能生效

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    action=ActionChains(driver)
    action.context_click(driver.find_element(By.ID,'su'))
    action.perform()
    time.sleep(2)
    driver.quit()

其他的操作都類似,注意懸停鼠標(biāo)操作的時(shí)候不要?jiǎng)邮髽?biāo)

也可以直接perform操作

    action=ActionChains(driver)
    action.move_to_element(driver.find_element(By.ID,'s-usersetting-top')).perform()

5.鍵盤操作

導(dǎo)包:from selenium.webdriver.common. keys import Keys
1. send_keys ( Keys.BACK_SPACE)        刪除鍵(BackSpace)
2. send_keys(Keys.SPACE)                      空格鍵(Space)
3. send_keys(Keys.TAB)                           制表鍵(Tab)
4. send_keys (Keys.ESCAPE)                  回退鍵(Esc)
5. send_keys (Keys.ENTER)                     回車鍵(Enter)
6. send_keys (Keys.coTROL , 'a ')            全選(Ctrl+A)
7. send_keys(Keys.CONTROL, 'c ')           復(fù)制(Ctrl+C)

 下面是一個(gè)示例代碼

from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    driver.find_element(By.ID,'kw').send_keys('woshini')
    time.sleep(2)
    driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE)
    time.sleep(2)
    driver.find_element(By.ID, 'kw').send_keys(Keys.CONTROL,'a')
    driver.find_element(By.ID, 'kw').send_keys(Keys.BACKSPACE)
    time.sleep(2)
    driver.quit()

6.元素等待 

概念:在定位頁面元素時(shí)如果未找到,會在指定時(shí)間內(nèi)一直等待的過程
元素等待的類型:   1.隱式等待2.顯示等待

1.隱式等待

概念:定位元素時(shí),如果能定位到元素則直接返回該元素,不觸發(fā)等待;如果不能定位到該元素,則間隔一段時(shí)間后再去定位元素;如果在達(dá)到最大時(shí)長時(shí)還沒有找到指定元素,則拋出元素不存在的異常NoSuchElementException 。

方法: driver. implicitly_wait(timeout)
(timeout:為等待最大時(shí)長,單位:秒)
說明:隱式等待為全局設(shè)置(只需要設(shè)置一次,就會作用于所有元素)

注意:當(dāng)隱式等待被激活時(shí),雖然目標(biāo)元素已經(jīng)出現(xiàn)了,但是還是會由于當(dāng)前頁面內(nèi)的其他元素的未加載完成,而繼續(xù)等待,進(jìn)而增加代碼的執(zhí)行時(shí)長

from selenium import webdriver
from selenium.webdriver.common.by import By
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    driver.implicitly_wait(10)
    driver.find_element(By.ID,'kw').send_keys('woshini')
    driver.find_element(By.ID, 'su').click()
    driver.quit()

2.顯式等待

概念:定位指定元素時(shí),如果能定位到元素則直接返回該元素,不觸發(fā)等待:如果不能定位到該元素,則間隔一段時(shí)間后再去定位元素;如果在達(dá)到最大時(shí)長時(shí)還沒有找到指定元素,則拋出超時(shí)異常TimeoutException 。

在Selenium中把顯式等待的相關(guān)方法封裝在WebDriverWait類中

1.導(dǎo)包等待類--> from selenium. webdriver. support.wait import webDriverWait

2. webDriverWait(driver,timeout, poll_frequency=o.5)

driver:瀏覽器驅(qū)動(dòng)對象
timeout:超時(shí)的時(shí)長,單位:秒
poll_frequency:檢測間隔時(shí)間,默認(rèn)為0.5秒
3.調(diào)用方法until(method):直到...時(shí)

method:函數(shù)名稱,該函數(shù)用來實(shí)現(xiàn)對元素的定位
一般使用匿名函數(shù)來實(shí)現(xiàn): lambda x: x.find_element_by_id("userA")
4. element = webDriverwait(driver,10,1).until( lambda x: x.find_element_by_id("userA")

from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.wait import WebDriverWait
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.get("https://www.baidu.com/")
    element=WebDriverWait(driver,10,1).until(lambda x:x.find_element(By.ID,'kw'))
    element.send_keys('zxn')
    time.sleep(2)
    driver.quit()

隱式等待和顯式等待對比

元素個(gè)數(shù)調(diào)用方法異常類型隱式等待全局瀏覽器對象調(diào)用NoSuchElementException顯式等待單個(gè)實(shí)例化對象調(diào)用TimeoutException

四.元素定位

1.常見的元素定位

2.ID定位 By.ID

id屬性在HTML中是唯一的,因此使用id定位可以確保找到頁面上唯一的元素。

由于id是唯一的,瀏覽器在查找元素時(shí)可以快速定位到目標(biāo)元素,提高了定位的效率

例如百度的搜索框的id為kw

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
driver.find_element(By.ID,'kw').send_keys('woshi')
driver.find_element(By.ID,'su').click()
time.sleep(2)

3.類名定位 By.CLASS_NAME

因?yàn)閕d是唯一的,但是className相同的element是很多的,因此使用find_element顯示是不妥的,但是也是可以使用的,默認(rèn)找到的是第一個(gè)className相同的標(biāo)簽

比如下面的標(biāo)簽,我們通過find_elements,通過className找到值為channel-link的標(biāo)簽(返回的是list集合),然后點(diǎn)擊綜藝標(biāo)簽.

 代碼實(shí)現(xiàn)具體如下

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.bilibili.com/")
#頁面最大化
driver.maximize_window()
driver.find_elements(By.CLASS_NAME,'channel-link')[4].click()
time.sleep(2)

注意:如果一個(gè)標(biāo)簽有多個(gè)class(中間用空格隔開),此時(shí)我們只能用單個(gè)class進(jìn)行定位

4.標(biāo)簽名定位 By.TAG_NAME

通過標(biāo)簽名定位元素位置

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.bilibili.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.TAG_NAME,'input').send_keys('zxn')
driver.find_elements(By.TAG_NAME,'a')[0]
time.sleep(2)
driver.close()

5.名稱定位 By.NAME

name屬性通常在表單中有,比如百度的輸入框

注意name也不是唯一的

6.鏈接文本定位 By.LINK_TEXT 

使用鏈接(a標(biāo)簽)的全部文字定位元素,比如通過百度頁面的新聞文本進(jìn)行定位

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.LINK_TEXT,'新聞').click()
time.sleep(2)
driver.close()

7.鏈接部分文本定位 By.PARTIAL_LINK_TEXT

使用鏈接(a標(biāo)簽)的部分文字定位元素,相當(dāng)于模糊匹配,比如下面代碼,模糊匹配文本含'聞'的可點(diǎn)擊文本

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.PARTIAL_LINK_TEXT,'聞').click()
time.sleep(2)
driver.close()

8.css_selector定位 By.CSS_SELECTOR

選擇器

格式

示例

示例說明

標(biāo)簽選擇器

html標(biāo)簽

input

選擇所有<input>元素

ID選擇器

#id屬性值

#kw

選擇所有id='kw'的元素

類選擇器

.class屬性值

.nav-search-input

選擇所有class='nav-search-input'的元素

屬性選擇器

[屬性名]

[name="wd"]

選擇所有name等于"wd"的元素

組合選擇器

標(biāo)簽加屬性描述

input.s_ipt

選擇所有class='_ipt'的<input>元素

父子關(guān)系

元素1>元素2

div>a

選擇所有父級是<div>的<a>元素

后代關(guān)系

元素1 元素2

div a

選擇<div>中的所有<a>元素

第一子元素

:first-child

a:first-child

選擇所有<a>元素且該元素是其父級的第一個(gè)元素

最后一個(gè)元素

:last-child

a:last-child

選擇所有<a>元素且該元素是其父級的最后一個(gè)元素

順序選擇器

:nth-child(n)

a:nth-child(2)

選擇所有<a>元素且該元素是其父級的第二個(gè)子元素

1. ID選擇器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'#kw').send_keys('測試')
driver.find_element(By.CSS_SELECTOR,'#su').click()
time.sleep(2)
driver.close()

2.類選擇器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.bilibili.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'.nav-search-input').send_keys('測試')
driver.find_element(By.CSS_SELECTOR,'.nav-search-btn').click()
time.sleep(2)
driver.close()

3.屬性選擇器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'[name="wd"]').send_keys('測試')
driver.find_element(By.CSS_SELECTOR,'#su').click()
time.sleep(2)
driver.close()

4.標(biāo)簽選擇器

選擇a標(biāo)簽中href="http://image.baidu.com/"的element

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" ]').click()
time.sleep(2)
driver.close()

href后面加*表示模糊匹配,此時(shí)href中只要包含 image.baidu即可

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'a[href*="image.baidu"]').click()
time.sleep(2)
driver.close()

 href后面加^表示匹配開頭,結(jié)尾模糊匹配,此時(shí)href中只要開頭為http://image即可

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'a[href^="http://image"]').click()
time.sleep(2)
driver.close()

 href后面加$表示匹配開頭,開頭模糊匹配,此時(shí)href中只要結(jié)尾為image.baidu.com/即可 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'a[href$="image.baidu.com/"]').click()
time.sleep(2)
driver.close()

5.組合選擇器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'input.s_ipt').send_keys("測試")
driver.find_element(By.CSS_SELECTOR,'#su').click()
time.sleep(2)
driver.close()

6.父子關(guān)系

可以看到form > span > input總共有兩個(gè)標(biāo)簽,其中一個(gè)為輸入框,一個(gè)為點(diǎn)擊搜索

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_elements(By.CSS_SELECTOR,'form > span > input')[0].send_keys("測試")
driver.find_elements(By.CSS_SELECTOR,'form > span > input')[1].click()
time.sleep(2)
driver.close()

7.后代關(guān)系

 當(dāng)我們form input,此時(shí)表示form標(biāo)簽下的所有input標(biāo)簽,不管多少層級,都篩選出來

8.順序選擇器 

選擇視頻進(jìn)行點(diǎn)擊,此時(shí)視頻位于第8個(gè)a標(biāo)簽(注意從1開始)

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.CSS_SELECTOR,'div#s-top-left > a:nth-child(6)').click()
time.sleep(2)
driver.close()

tips:可以通過以下操作進(jìn)行復(fù)制selector進(jìn)行CSS_SELECTOR的便捷操作

9. xpath定位 By.XPATH

說明

舉例

從根節(jié)點(diǎn)開始選取(絕對路徑)

/html/div/

從任意節(jié)點(diǎn)開始選取(相對路徑)

//div,列舉出所有div標(biāo)簽

選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)

//input/.. 會選取 input 的父節(jié)點(diǎn)

選取屬性,或者根據(jù)屬性選取

使用id屬性定位

//div[@id='id_value']

使用class屬性定位

//a[@class="mnav"]

使用name屬性定位

//div[@name='wd']

多個(gè)屬性定位

//input[@name="wd" and @class="s_ipt"]

第n個(gè)元素,使用index定位

//div[@id="s-top-left"]/a[3]

最后一個(gè)元素

//a[@class="mnav"][last()]

屬性包含某字段

//div[contains(@title,'text')]

屬性以某字段開頭

//div[starts-with(@title,'text')]

屬性以某字段結(jié)尾

//div[ends-with(@title,'text')]

文本包含

//a[contains(text(),"網(wǎng)盤")]

文本等于

//span[text() = "菜單"]

同級弟弟元素

//div[@id=='id']/following-sibling::div

同級哥哥元素

//div[@id=='id']/preceding-sibling::div

因?yàn)楹蚦ss_selector類似,所以不過多演示

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實(shí)例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標(biāo)簽只有一個(gè)
driver.find_element(By.XPATH,'//div[@id="s-top-left"]/a[3]').click()
time.sleep(2)
driver.close()

 通用的xpath也可以直接進(jìn)行復(fù)制

五.不同元素定位實(shí)戰(zhàn) 

可以到此網(wǎng)站進(jìn)行訓(xùn)練:https://iviewui.com/view-ui-plus/component/

1.單選框 

現(xiàn)在的需求是將Apple,Android,Window進(jìn)行依次點(diǎn)擊 

 通過標(biāo)簽屬性進(jìn)行定位

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://iviewui.com/view-ui-plus/component/form/radio")
    driver.find_elements(By.XPATH,'//input[@type="radio" and @class="ivu-radio-input"]')[1].click()
    time.sleep(2)
    driver.find_elements(By.XPATH, '//input[@type="radio" and @class="ivu-radio-input"]')[2].click()
    time.sleep(2)
    driver.find_elements(By.XPATH, '//input[@type="radio" and @class="ivu-radio-input"]')[3].click()
    time.sleep(2)
    driver.close()

通過文本內(nèi)容進(jìn)行定位: 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://iviewui.com/view-ui-plus/component/form/radio")
    driver.find_element(By.XPATH,'//span[text()="Apple"]').click()
    time.sleep(2)
    driver.find_element(By.XPATH, '//span[text()="Android"]').click()
    time.sleep(2)
    driver.find_element(By.XPATH, '//span[text()="Windows"]').click()
    time.sleep(2)
    driver.close()

2.多選框

同理

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://iviewui.com/view-ui-plus/component/form/checkbox")
    driver.find_elements(By.XPATH,'//span[text()="香蕉"]')[0].click()
    time.sleep(2)
    driver.find_elements(By.XPATH, '//span[text()="蘋果"]')[0].click()
    time.sleep(2)
    driver.find_elements(By.XPATH, '//span[text()="西瓜"]')[0].click()
    time.sleep(2)
    driver.close()

3.下拉框

到這個(gè)網(wǎng)址進(jìn)行鍛煉:https://sahitest.com/demo/selectTest.htm

select.select_by_index:

通過option的順序來選擇(從0開始)

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.select import Select
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/selectTest.htm")
    time.sleep(2)
    select=Select(driver.find_element(By.ID,'s1'))
    select.select_by_index(1)
    time.sleep(2)
    driver.close()

 select.select_by_value:

通過option的value屬性值來選擇

if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/selectTest.htm")
    time.sleep(2)
    select=Select(driver.find_element(By.ID,'s1'))
    select.select_by_value("51")
    time.sleep(2)
    driver.close()

 select.
select_by_visible_text

通過option文本值來選擇

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.support.select import Select
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/selectTest.htm")
    time.sleep(2)
    select=Select(driver.find_element(By.ID,'s1'))
    select.select_by_visible_text("Cell Phone")
    time.sleep(2)
    driver.close()

 4.級聯(lián)選擇器

在網(wǎng)站:https://iviewui.com/view-ui-plus/component/form/cascader

進(jìn)行級聯(lián)選擇器的訓(xùn)練 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://iviewui.com/view-ui-plus/component/form/cascader")
    driver.find_element(By.XPATH,'//input[@class="ivu-input ivu-input-default"]').click()
    time.sleep(2)
    driver.find_element(By.XPATH,'//li[contains(text(),"北京")]').click()
    time.sleep(2)
    driver.find_element(By.XPATH, '//li[contains(text(),"故宮")]').click()
    time.sleep(2)
    driver.close()

5.日期選擇器

在https://iviewui.com/view-ui-plus/component/form/date-picker

進(jìn)行訓(xùn)練

此時(shí)我們使用的是直接send_keys進(jìn)行操作 

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://iviewui.com/view-ui-plus/component/form/date-picker")
    driver.find_element(By.XPATH,'//input[@class="ivu-input ivu-input-default ivu-input-with-suffix"]').send_keys("2023-12-12")
    time.sleep(2)
    driver.find_elements(By.XPATH,'//input[@class="ivu-input ivu-input-default ivu-input-with-suffix"]')[1].send_keys("2023-12-18 - 2024-01-16")
    time.sleep(2)
    driver.close()

6.三種彈框

1.alert

:Alert Test

進(jìn)行訓(xùn)練

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/alertTest.htm")
    driver.find_element(By.NAME,'b1').click()
    time.sleep(2)
    print(driver.switch_to.alert.text)
    driver.switch_to.alert.accept()
    time.sleep(2)
    driver.close()

 2.confirm

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/confirmTest.htm")
    driver.find_element(By.NAME,'b1').click()
    time.sleep(2)
    print(driver.switch_to.alert.text)
    #點(diǎn)擊確定
    # driver.switch_to.alert.accept()
    #點(diǎn)擊取消
    driver.switch_to.alert.dismiss()
    time.sleep(2)
    driver.close()

 3.Prompt

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/promptTest.htm")
    driver.find_element(By.NAME,'b1').click()
    time.sleep(2)
    driver.switch_to.alert.send_keys("測試")
    time.sleep(2)
    #點(diǎn)擊確定
    driver.switch_to.alert.accept()
    #點(diǎn)擊取消
    # driver.switch_to.alert.dismiss()
    time.sleep(2)
    driver.close()

7.文件上傳

這個(gè)網(wǎng)站:https://sahitest.com/demo/php/fileUpload.htm

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/php/fileUpload.htm")
    driver.find_element(By.ID,'file').send_keys(r'C:\Users\lenovo\Desktop\認(rèn)證\阿里云.png')
    time.sleep(2)
    driver.find_element(By.NAME,'submit').click()
    time.sleep(2)
    driver.close()

8.文件下載

到這個(gè)網(wǎng)站:http://chromedriver.storage.googleapis.com/index.html

from selenium import webdriver
from selenium.webdriver.common.by import By
import time,os
if __name__ == '__main__':
    chromeOptions=webdriver.ChromeOptions()
    #設(shè)置下載路徑
    prefs={"download.default_directory":r"D:\PythonCave\selenium\file"}
    chromeOptions.add_experimental_option("prefs",prefs)
    driver=webdriver.Chrome(chromeOptions)
    driver.get("http://chromedriver.storage.googleapis.com/index.html")
    time.sleep(2)
    driver.find_element(By.XPATH,'/html/body/table/tbody/tr[3]/td[2]/a').click()
    time.sleep(2)
    driver.find_element(By.XPATH, '/html/body/table/tbody/tr[7]/td[2]/a').click()
    time.sleep(2)
    driver.close()

9.iframe框架

frame是網(wǎng)頁開發(fā)中常見應(yīng)用。例如頁面布局、局部刷新,頁面分割,都是frame的用途表現(xiàn)
使用frame會給用戶帶來非常舒適的使用感受。

frame包括(frameset標(biāo)簽、frame標(biāo)簽、iframe標(biāo)簽)
frameset和frame結(jié)合一起使用,可以對頁面進(jìn)行分割。例如sahitest的Frames Test。對頁面進(jìn)行上下切割,并嵌套html頁面

iframe是個(gè)內(nèi)聯(lián)框架,是在頁面里生成個(gè)內(nèi)部框架??梢郧短锥鄠€(gè)html頁面。大多網(wǎng)頁使用的是iframe框架。比如163郵箱

這個(gè)網(wǎng)站練習(xí):IFRAME Tests

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/iframesTest.htm")
    driver.find_element(By.ID,'checkRecord').clear()
    driver.find_element(By.ID, 'checkRecord').send_keys('wuhu~')
    time.sleep(2)
    #用下標(biāo)定位iframe
    driver.switch_to.frame(0)
    driver.find_element(By.CSS_SELECTOR, 'a[href="linkTest.htm" rel="external nofollow"  rel="external nofollow" ]').click()
    time.sleep(2)
    driver.close()

 同樣的也可以通過id,name進(jìn)行定位,也可以使用下面的元素定位來進(jìn)行切換

    driver.switch_to.frame(driver.find_element(By.XPATH,"/html/body/iframe"))

可以切換到上一級iframe

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.get("https://sahitest.com/demo/iframesTest.htm")
    driver.find_element(By.ID,'checkRecord').clear()
    driver.find_element(By.ID, 'checkRecord').send_keys('wuhu~')
    time.sleep(2)
    #用下標(biāo)定位iframe
    driver.switch_to.frame(driver.find_element(By.XPATH,"/html/body/iframe"))
    driver.find_element(By.CSS_SELECTOR, 'a[href="linkTest.htm" rel="external nofollow"  rel="external nofollow" ]').click()
    driver.switch_to.parent_frame()
    driver.find_element(By.ID,'checkRecord').clear()
    driver.find_element(By.ID, 'checkRecord').send_keys('wula~')
    time.sleep(2)
    time.sleep(2)
    driver.close()

也可以直接切換到default_content

driver.switch_to.default_content()

 注意:frame之間不能互相切換,只能主頁面和frame之間進(jìn)行切換

10.多窗口切換

在Selenium中封裝了獲取當(dāng)前窗口包柄、獲取所有窗口句柄和切換到指定句柄窗口的方法句柄:

英文handle,窗口的唯一識別碼

方法:
1). driver. current_window_handle          -->獲取當(dāng)前窗口句柄

2). drhver.window_handles                     -->獲取所有窗口句柄
3). driver.switch_to.window( handle)       -->切換指定句柄窗口

任意一個(gè)窗口都有唯一的一個(gè)句柄值,可以通過句柄值完成窗口切換操作

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com/")
    driver.find_element(By.CSS_SELECTOR,'a[ rel="external nofollow" ]').click()
    print('當(dāng)前頁面的句柄值:',driver.current_window_handle)
    #切換窗口操作
    handles=driver.window_handles
    driver.switch_to.window(handles[-1])
    driver.find_element(By.ID,'wd1').send_keys('抗壓背鍋')
    driver.find_element(By.XPATH,'//*[@id="tb_header_search_form"]/span[1]/a').click()
    time.sleep(2)
    driver.quit()

 注意:如果關(guān)閉了當(dāng)前頁面,你需要切換到原頁面才能進(jìn)行相應(yīng)的操作,否則會報(bào)錯(cuò)

11.截圖操作

from selenium import webdriver
from selenium.webdriver.common.by import By
import time,os
if __name__ == '__main__':
    if not os.path.exists('./img'):
        os.mkdir('./img')
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com/")
    driver.find_element(By.ID,'kw').send_keys('woshi')
    driver.find_element(By.ID,'su').click()
    time.sleep(2)
    #推薦使用png
    #使用時(shí)間戳來標(biāo)記文件,windows系統(tǒng)文件名不支持特殊符號,盡量只是用下劃線
    cur_time=time.strftime('%Y%m%d_%H%M%S')
    driver.get_screenshot_as_file('./img/info_{}.png'.format(cur_time))
    driver.quit()

 12.驗(yàn)證碼處理

 在web應(yīng)用中,大部分系統(tǒng)在用戶登錄注冊的時(shí)候都要求輸入驗(yàn)證碼,而我們在設(shè)計(jì)自動(dòng)化測試腳本的時(shí)候,就需要面臨處理驗(yàn)證碼的問題。

說明: Selenium中并沒有對驗(yàn)證碼處理的方法,在這里我們介紹一下針對驗(yàn)證碼的幾種常用處理方式

方式:

  • 去掉驗(yàn)證碼(測試環(huán)境下-采用)
  • 設(shè)置萬能驗(yàn)證碼(生產(chǎn)環(huán)境和測試環(huán)境下-采用)
  • 驗(yàn)證碼識別技術(shù)(通過Python-tesseract來識別圖片類型驗(yàn)證碼;識別率很難達(dá)到100%)
  • 記錄cookie(通過記錄cookie進(jìn)行跳過登錄)

什么是cookie

  • Cookie是由web服務(wù)器生成的,并且保存在用戶瀏覽器上的小文本文件,它可以包含用戶相關(guān)的信息。
  • Cookie數(shù)據(jù)格式:鍵值對組成(python中的字典)
  • Cookie產(chǎn)生:客戶端請求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就向客戶端瀏覽器頒發(fā)一個(gè)Cookie數(shù)據(jù)
  • Cookie使用:當(dāng)瀏覽器再次請求該網(wǎng)站時(shí),瀏覽器把請求的數(shù)據(jù)和Cookie數(shù)據(jù)一同提交給服務(wù)器,服務(wù)器檢查該Cookie,以此來辨認(rèn)用戶狀態(tài)。

cookie繞過驗(yàn)證碼登錄的原理:

說明:客戶端登錄賬號后,將登錄狀態(tài)相關(guān)的cookie 信息發(fā)送給服務(wù)器保存,在發(fā)送請求,攜帶的cookie 信息如果和服務(wù)器保留的一致,則服務(wù)器任務(wù)客戶端為登錄狀態(tài)
應(yīng)用場景:

  • 實(shí)現(xiàn)會話跟蹤,記錄用戶登錄狀態(tài)
  • 實(shí)現(xiàn)記住密碼和自動(dòng)登錄的功能
  • 用戶未登錄的狀態(tài)下,記錄購物車中的商品

現(xiàn)在進(jìn)行代碼實(shí)驗(yàn):

 字段數(shù)據(jù)的key必須為name和value

from selenium import webdriver
import time
if __name__ == '__main__':
    driver=webdriver.Chrome()
    driver.maximize_window()
    driver.implicitly_wait(10)
    driver.get("https://www.baidu.com/")
    cookie_dict={'name':'BDUSS',
    'value':'FNxNDNHTXRNSjNoS0M5SjNHbE9GV0pjTlBHaGJhWjJnZFF3SVhub2VyZXJRNnBsRUFBQUFBJCQAAAAAAAAAAAEAAADzfmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKu2gJlU'}
    driver.add_cookie(cookie_dict)
    #刷新頁面,發(fā)送cookie信息給服務(wù)器進(jìn)行驗(yàn)證
    driver.refresh()
    time.sleep(2)
    driver.quit()

注意:

  • 本地瀏覽器中登錄的賬號,不能退出,否則cookie信息過期,需要重新獲取
  • 不同項(xiàng)目的能夠進(jìn)行登錄功能繞過的 cookie字段信息都不相同,具體需要詢問開發(fā)
  • 利用cookie 繞過登錄,則不能對登錄功能本身進(jìn)行測試
  • 個(gè)別項(xiàng)如果想要繞過登錄,有可能需要添加多個(gè)cookie字段

到此這篇關(guān)于基于python的selenium的文章就介紹到這了,更多相關(guān)python的selenium內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • matplotlib階梯圖的實(shí)現(xiàn)(step())

    matplotlib階梯圖的實(shí)現(xiàn)(step())

    這篇文章主要介紹了matplotlib階梯圖的實(shí)現(xiàn)(step()),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python學(xué)習(xí)之圖片濾鏡效果的實(shí)現(xiàn)

    Python學(xué)習(xí)之圖片濾鏡效果的實(shí)現(xiàn)

    濾鏡效果是圖像處理中常用的一種技術(shù),可以用來增強(qiáng)圖像的視覺效果,實(shí)現(xiàn)不同的效果,本文就來利用Python中的Image模塊實(shí)現(xiàn)常見的幾個(gè)圖片濾鏡吧
    2023-05-05
  • Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法

    Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法

    這篇文章主要介紹了Python二叉搜索樹與雙向鏈表轉(zhuǎn)換實(shí)現(xiàn)方法,涉及Python二叉搜索樹的定義、實(shí)現(xiàn)以及雙向鏈表的轉(zhuǎn)換技巧,需要的朋友可以參考下
    2016-04-04
  • Python設(shè)計(jì)模式之模板方法模式實(shí)例詳解

    Python設(shè)計(jì)模式之模板方法模式實(shí)例詳解

    這篇文章主要介紹了Python設(shè)計(jì)模式之模板方法模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了模板方法模式的概念、原理及Python定義、使用模板方法模式相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01
  • Python中l(wèi)ambda的用法及其與def的區(qū)別解析

    Python中l(wèi)ambda的用法及其與def的區(qū)別解析

    這篇文章主要介紹了Python中l(wèi)ambda的用法及其與def的區(qū)別解析,需要的朋友可以參考下
    2014-07-07
  • Django admin實(shí)現(xiàn)TextField字段changelist頁面換行、空格正常顯示

    Django admin實(shí)現(xiàn)TextField字段changelist頁面換行、空格正常顯示

    本文主要介紹了Django admin實(shí)現(xiàn)TextField字段changelist頁面換行、空格正常顯示,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python開發(fā)必須掌握的Pip使用全攻略

    Python開發(fā)必須掌握的Pip使用全攻略

    在這篇文章中,我們將深入探討Python的主要包管理工具——Pip,包括Pip的基本概念、安裝和配置、中國國內(nèi)鏡像源的使用等,需要的可以參考一下
    2023-07-07
  • python列表中刪除多條字典信息的三種方法

    python列表中刪除多條字典信息的三種方法

    本文主要介紹了python列表中刪除多條字典信息的三種方法,主要包括列表推導(dǎo)式,filter()函數(shù),del?關(guān)鍵字這三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Python中的 Set 與 dict

    Python中的 Set 與 dict

    這篇文章主要介紹了Python中的 Set 與 dict,Set 集合類型有無序 , 自動(dòng)去重等特點(diǎn),dict 字典類型 鍵值對存儲的數(shù)據(jù),可獲取,可修改 表面上有序,實(shí)際存儲時(shí)無序,下面更多詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-03-03
  • 服務(wù)器端jupyter notebook映射到本地瀏覽器的操作

    服務(wù)器端jupyter notebook映射到本地瀏覽器的操作

    這篇文章主要介紹了服務(wù)器端jupyter notebook映射到本地瀏覽器的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論