欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于python的selenium全網最新超詳細教程

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

一.安裝

安裝WebDriver

查看chrome版本號,設置-幫助-關于Google chrome,找到版本號。

可以到這個網站進行下載對應版本的chromedriver,如果chrome瀏覽器版本過高,可以下載最新版的chromedriver進行使用 Chrome for Testing availability

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

 終端輸入chromedriver -version驗證

必要的話,可以重啟電腦,可能進行編寫完代碼進行啟動的過程很慢,可以耐心等待一段時間,基本上都是可以運行的

二.源碼分析

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

三.webdriver操作方法

1.元素操作

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

拿百度舉例,我們可以現在搜索輸入框中清空數據(clear),然后輸入數據(send_keys),最后點擊按鈕進行跳轉(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)  設置瀏覽器窗口大小-->設置瀏覽器寬、高(像素點)
3. set_window_position(x, y)    設置瀏覽器窗口位置-->設置瀏覽器位置
4. back()    后退-->模擬瀏覽器后退按鈕
5. forward()    前進-->模擬瀏覽器前進按鈕
6. refresh()    刷新-->模擬瀏覽器F5刷新
7. close()    關閉當前窗口-->模擬點擊瀏覽器關閉按鈕
8. quit()     關閉瀏覽器驅動對象-->關閉所有程序啟動的窗口
9. title        獲取頁面title
10. current_url   獲取當前頁面URL

可以根據以下的代碼進行理解 

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()    關閉當前窗口-->模擬點擊瀏覽器關閉按鈕   關閉單個頁面

注意:當打開新的頁面時,close方法關閉的是原頁面

比如下面的代碼,打開了百度的頁面,之后點擊百度地圖頁面,打開了一個新的標簽頁,close方法關閉了百度頁面,而,百度地圖頁面并沒有被關閉

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()     關閉瀏覽器驅動對象-->關閉所有程序啟動的窗口  #關閉所有的頁面

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")     獲取屬性值,傳遞的參數為元素的屬性名

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

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.鼠標操作

常見的鼠標操作有:點擊、右擊、雙擊、懸停、拖拽等,對于這些鼠標操作Selenium都封裝了相應的操作方法。

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

4. move_to_element(element)        懸停-->模擬鼠標懸停效果
5. perform()         執(zhí)行-->此方法用來執(zhí)行以上所有鼠標操作
為了更好的學習其他方法,我們先學習perform()執(zhí)行方法,因為所有的方法都需要執(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()

其他的操作都類似,注意懸停鼠標操作的時候不要動鼠標

也可以直接perform操作

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

5.鍵盤操作

導包: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 ')           復制(Ctrl+C)

 下面是一個示例代碼

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.元素等待 

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

1.隱式等待

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

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

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

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.顯式等待

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

在Selenium中把顯式等待的相關方法封裝在WebDriverWait類中

1.導包等待類--> from selenium. webdriver. support.wait import webDriverWait

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

driver:瀏覽器驅動對象
timeout:超時的時長,單位:秒
poll_frequency:檢測間隔時間,默認為0.5秒
3.調用方法until(method):直到...時

method:函數名稱,該函數用來實現對元素的定位
一般使用匿名函數來實現: 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()

隱式等待和顯式等待對比

元素個數調用方法異常類型隱式等待全局瀏覽器對象調用NoSuchElementException顯式等待單個實例化對象調用TimeoutException

四.元素定位

1.常見的元素定位

2.ID定位 By.ID

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

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

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

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實例化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

因為id是唯一的,但是className相同的element是很多的,因此使用find_element顯示是不妥的,但是也是可以使用的,默認找到的是第一個className相同的標簽

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

 代碼實現具體如下

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實例化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)

注意:如果一個標簽有多個class(中間用空格隔開),此時我們只能用單個class進行定位

4.標簽名定位 By.TAG_NAME

通過標簽名定位元素位置

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.bilibili.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
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標簽)的全部文字定位元素,比如通過百度頁面的新聞文本進行定位

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

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

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

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

8.css_selector定位 By.CSS_SELECTOR

選擇器

格式

示例

示例說明

標簽選擇器

html標簽

input

選擇所有<input>元素

ID選擇器

#id屬性值

#kw

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

類選擇器

.class屬性值

.nav-search-input

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

屬性選擇器

[屬性名]

[name="wd"]

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

組合選擇器

標簽加屬性描述

input.s_ipt

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

父子關系

元素1>元素2

div>a

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

后代關系

元素1 元素2

div a

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

第一子元素

:first-child

a:first-child

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

最后一個元素

:last-child

a:last-child

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

順序選擇器

:nth-child(n)

a:nth-child(2)

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

1. ID選擇器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
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
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.bilibili.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
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
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
driver.find_element(By.CSS_SELECTOR,'[name="wd"]').send_keys('測試')
driver.find_element(By.CSS_SELECTOR,'#su').click()
time.sleep(2)
driver.close()

4.標簽選擇器

選擇a標簽中href="http://image.baidu.com/"的element

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

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

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

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

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

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

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
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
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
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.父子關系

可以看到form > span > input總共有兩個標簽,其中一個為輸入框,一個為點擊搜索

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
#實例化webdriver
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
#頁面最大化
driver.maximize_window()
#input標簽只有一個
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.后代關系

 當我們form input,此時表示form標簽下的所有input標簽,不管多少層級,都篩選出來

8.順序選擇器 

選擇視頻進行點擊,此時視頻位于第8個a標簽(注意從1開始)

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

tips:可以通過以下操作進行復制selector進行CSS_SELECTOR的便捷操作

9. xpath定位 By.XPATH

說明

舉例

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

/html/div/

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

//div,列舉出所有div標簽

選取當前節(jié)點的父節(jié)點

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

選取屬性,或者根據屬性選取

使用id屬性定位

//div[@id='id_value']

使用class屬性定位

//a[@class="mnav"]

使用name屬性定位

//div[@name='wd']

多個屬性定位

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

第n個元素,使用index定位

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

最后一個元素

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

屬性包含某字段

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

屬性以某字段開頭

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

屬性以某字段結尾

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

文本包含

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

文本等于

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

同級弟弟元素

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

同級哥哥元素

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

因為和css_selector類似,所以不過多演示

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

 通用的xpath也可以直接進行復制

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

可以到此網站進行訓練:https://iviewui.com/view-ui-plus/component/

1.單選框 

現在的需求是將Apple,Android,Window進行依次點擊 

 通過標簽屬性進行定位

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()

通過文本內容進行定位: 

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.下拉框

到這個網址進行鍛煉: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.級聯選擇器

在網站:https://iviewui.com/view-ui-plus/component/form/cascader

進行級聯選擇器的訓練 

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

進行訓練

此時我們使用的是直接send_keys進行操作 

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

進行訓練

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)
    #點擊確定
    # driver.switch_to.alert.accept()
    #點擊取消
    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)
    #點擊確定
    driver.switch_to.alert.accept()
    #點擊取消
    # driver.switch_to.alert.dismiss()
    time.sleep(2)
    driver.close()

7.文件上傳

這個網站: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\認證\阿里云.png')
    time.sleep(2)
    driver.find_element(By.NAME,'submit').click()
    time.sleep(2)
    driver.close()

8.文件下載

到這個網站: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()
    #設置下載路徑
    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是網頁開發(fā)中常見應用。例如頁面布局、局部刷新,頁面分割,都是frame的用途表現
使用frame會給用戶帶來非常舒適的使用感受。

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

iframe是個內聯框架,是在頁面里生成個內部框架??梢郧短锥鄠€html頁面。大多網頁使用的是iframe框架。比如163郵箱

這個網站練習: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)
    #用下標定位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進行定位,也可以使用下面的元素定位來進行切換

    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)
    #用下標定位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之間進行切換

10.多窗口切換

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

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

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

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

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

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('當前頁面的句柄值:',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()

 注意:如果關閉了當前頁面,你需要切換到原頁面才能進行相應的操作,否則會報錯

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
    #使用時間戳來標記文件,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.驗證碼處理

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

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

方式:

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

什么是cookie

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

cookie繞過驗證碼登錄的原理:

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

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

現在進行代碼實驗:

 字段數據的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信息給服務器進行驗證
    driver.refresh()
    time.sleep(2)
    driver.quit()

注意:

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

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

相關文章

  • matplotlib階梯圖的實現(step())

    matplotlib階梯圖的實現(step())

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

    Python學習之圖片濾鏡效果的實現

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

    Python二叉搜索樹與雙向鏈表轉換實現方法

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

    Python設計模式之模板方法模式實例詳解

    這篇文章主要介紹了Python設計模式之模板方法模式,結合實例形式較為詳細的分析了模板方法模式的概念、原理及Python定義、使用模板方法模式相關操作技巧,需要的朋友可以參考下
    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實現TextField字段changelist頁面換行、空格正常顯示

    Django admin實現TextField字段changelist頁面換行、空格正常顯示

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

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

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

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

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

    Python中的 Set 與 dict

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

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

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

最新評論