Selenium操作指南(全)

🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快

大家好,今天帶大家一起系統的學習下模擬瀏覽器運行庫Selenium,它是一個用于Web自動化測試及爬蟲應用的重要工具。

Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla FirefoxSafariGoogle ChromeOperaEdge等。

這里我將以Chrome為例進行Selenium功能的演示~

0. 準備工作

在開始后續功能演示之前,我們需要先安裝Chrome瀏覽器并配置好ChromeDriver,當然也需要安裝selenium庫!

0.1. 安裝selenium庫
pip install selenium
0.2. 安裝瀏覽器驅動

其實,有兩種方式安裝瀏覽器驅動:一種是常見的手動安裝,另一種則是利用第三方庫自動安裝。

以下前提:大家都已經安裝好了Chrome瀏覽器哈

手動安裝

先查看本地Chrome瀏覽器版本:(兩種方式均可)

  • 在瀏覽器的地址欄鍵入Chrome://version,即可查看瀏覽器版本號

  • 或者點擊Chrome菜單?幫助關于Google Chrome,查看瀏覽器版本號

再選擇對應版本號的驅動版本

下載地址:https://chromedriver.storage.googleapis.com/index.html

最后進行環境變量配置,也就是將對應的ChromeDriver的可執行文件chromedriver.exe文件拖到PythonScripts目錄下。

注:當然也可以不這樣做,但是在調用的時候指定chromedriver.exe絕對路徑亦可。

自動安裝

自動安裝需要用到第三方庫webdriver_manager,先安裝這個庫,然后調用對應的方法即可。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from webdriver_manager.chrome import ChromeDriverManagerbrowser = webdriver.Chrome(ChromeDriverManager().install())browser.get('http://www.baidu.com')
search = browser.find_element_by_id('kw')
search.send_keys('python')
search.send_keys(Keys.ENTER)# 關閉瀏覽器
browser.close()

在上述代碼中,ChromeDriverManager().install()方法就是自動安裝驅動的操作,它會自動獲取當前瀏覽器的版本并去下載對應的驅動到本地。

====== WebDriver manager ======
Current google-chrome version is 96.0.4664
Get LATEST chromedriver version for 96.0.4664 google-chrome
There is no [win32] chromedriver for browser  in cache
Trying to download new driver from https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_win32.zip
Driver has been saved in cache [C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45]

如果本地已經有該瀏覽器渠道,則會提示其已存在。

====== WebDriver manager ======
Current google-chrome version is 96.0.4664
Get LATEST driver version for 96.0.4664
Driver [C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe] found in cache

搞定以上準備工作,我們就可以開始本文正式內容的學習啦~

1. 基本用法

這節我們就從初始化瀏覽器對象、訪問頁面、設置瀏覽器大小、刷新頁面和前進后退等基礎操作。

1.1. 初始化瀏覽器對象

在準備工作部分我們提到需要將瀏覽器渠道添加到環境變量或者指定絕對路徑,前者可以直接初始化后者則需要進行指定。

from selenium import webdriver# 初始化瀏覽器為chrome瀏覽器
browser = webdriver.Chrome()# 指定絕對路徑的方式
path = r'C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe'
browser = webdriver.Chrome(path)# 關閉瀏覽器
browser.close()

初始化瀏覽器對象

可以看到以上是有界面的瀏覽器,我們還可以初始化瀏覽器為無界面的瀏覽器

from selenium import webdriver# 無界面的瀏覽器
option = webdriver.ChromeOptions()
option.add_argument("headless")
browser = webdriver.Chrome(options=option)# 訪問百度首頁
browser.get(r'https://www.baidu.com/')
# 截圖預覽
browser.get_screenshot_as_file('截圖.png')# 關閉瀏覽器
browser.close()

截圖

完成瀏覽器對象的初始化后并將其賦值給了browser對象,接下來我們就可以調用browser來執行各種方法模擬瀏覽器的操作了。

1.2. 訪問頁面

進行頁面訪問使用的是get方法,傳入參數為待訪問頁面的URL地址即可。

from selenium import webdriver# 初始化瀏覽器為chrome瀏覽器
browser = webdriver.Chrome()# 訪問百度首頁
browser.get(r'https://www.baidu.com/')# 關閉瀏覽器
browser.close()

1.3. 設置瀏覽器大小

set_window_size()方法可以用來設置瀏覽器大小(就是分辨率),而maximize_window則是設置瀏覽器為全屏!

from selenium import webdriver
import time  browser = webdriver.Chrome()# 設置瀏覽器大小:全屏
browser.maximize_window()   
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 設置分辨率 500*500
browser.set_window_size(500,500)  
time.sleep(2)# 設置分辨率 1000*800
browser.set_window_size(1000,800) 
time.sleep(2)# 關閉瀏覽器
browser.close()

這里就不截圖了,大家自行演示看效果哈~

1.4. 刷新頁面

刷新頁面是我們在瀏覽器操作時很常用的操作,這里refresh()方法可以用來進行瀏覽器頁面刷新。

from selenium import webdriver
import time  browser = webdriver.Chrome()# 設置瀏覽器全屏
browser.maximize_window()   
browser.get(r'https://www.baidu.com')  
time.sleep(2)try:# 刷新頁面browser.refresh()  print('刷新頁面')
except Exception as e:print('刷新失敗')# 關閉瀏覽器
browser.close()

大家也是自行演示看效果哈,同F5快捷鍵。

1.5. 前進后退

前進后退也是我們在使用瀏覽器時非常常見的操作,這里forward()方法可以用來實現前進,back()可以用來實現后退。

from selenium import webdriver
import time  browser = webdriver.Chrome()# 設置瀏覽器全屏
browser.maximize_window()   
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 打開淘寶頁面
browser.get(r'https://www.taobao.com')  
time.sleep(2)# 后退到百度頁面
browser.back()  
time.sleep(2)# 前進的淘寶頁面
browser.forward() 
time.sleep(2)# 關閉瀏覽器
browser.close()

2. 獲取頁面基礎屬性

當我們用selenium打開某個頁面,有一些基礎屬性如網頁標題、網址、瀏覽器名稱、頁面源碼等信息。

from selenium import webdriverbrowser = webdriver.Chrome()
browser.get(r'https://www.baidu.com') # 網頁標題
print(browser.title)
# 當前網址
print(browser.current_url)
# 瀏覽器名稱
print(browser.name)
# 網頁源碼
print(browser.page_source)

輸出如下:

百度一下,你就知道
https://www.baidu.com/
chrome
<html><head><script async="" src="https://passport.baidu.com/passApi/js/wrapper.js?cdnversion=1640515789507&amp;_=1640515789298"></script><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color"..."

需要注意的是,這里的頁面源碼我們就可以用正則表達式Bs4xpath以及pyquery等工具進行解析提取想要的信息了。

3. 定位頁面元素

我們在實際使用瀏覽器的時候,很重要的操作有輸入文本、點擊確定等等。對此,Selenium提供了一系列的方法來方便我們實現以上操作。常說的8種定位頁面元素的操作方式,我們一一演示一下!

我們以百度首頁的搜索框節點為例,搜索python

搜索框

搜索框的html結構:

<input?id="kw"?name="wd"?class="s_ipt"?value=""?maxlength="255"?autocomplete="off">
3.1. id定位

find_element_by_id()根據id屬性獲取,這里id屬性是?kw

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 在搜索框輸入 python
browser.find_element_by_id('kw').send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()

3.2. name定位

find_element_by_name()根據name屬性獲取,這里name屬性是?wd

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 在搜索框輸入 python
browser.find_element_by_name('wd').send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()
3.3. class定位

find_element_by_class_name()根據class屬性獲取,這里class屬性是s_ipt

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 在搜索框輸入 python
browser.find_element_by_class_name('s_ipt').send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()
3.4. tag定位

我們知道HTML是通過tag來定義功能的,比如input是輸入,table是表格等等。每個元素其實就是一個tag,一個tag往往用來定義一類功能,我們查看百度首頁的html代碼,可以看到有很多同類tag,所以其實很難通過tag去區分不同的元素。

find_element_by_tag_name()

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 在搜索框輸入 python
browser.find_element_by_tag_name('input').send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()

由于存在多個input,以上代碼會報錯。

3.5. link定位

這種方法顧名思義就是用來定位文本鏈接的,比如百度首頁上方的分類模塊鏈接。

find_element_by_link_text()

以新聞為例

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 點擊新聞 鏈接
browser.find_element_by_link_text('新聞').click()
time.sleep(2)# 關閉瀏覽器全部頁面
browser.quit()
3.6. partial定位

有時候一個超鏈接的文本很長,我們如果全部輸入,既麻煩,又顯得代碼很不美觀,這時候我們就可以只截取一部分字符串,用這種方法模糊匹配了。

find_element_by_partial_link_text()

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 點擊新聞 鏈接
browser.find_element_by_partial_link_text('聞').click()
time.sleep(2)# 關閉瀏覽器全部頁面
browser.quit()
3.7. xpath定位

前面介紹的幾種定位方法都是在理想狀態下,有一定使用范圍的,那就是:在當前頁面中,每個元素都有一個唯一idnameclass超鏈接文本的屬性,那么我們就可以通過這個唯一的屬性值來定位他們。

但是在實際工作中并非有這么美好,那么這個時候我們就只能通過xpath或者css來定位了。

find_element_by_xpath()

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 在搜索框輸入 python
browser.find_element_by_xpath("//*[@id='kw']").send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()
3.8. css定位

這種方法相對xpath要簡潔些,定位速度也要快些。

find_element_by_css_selector()

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  
time.sleep(2)# 在搜索框輸入 python
browser.find_element_by_css_selector('#kw').send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()
3.9. find_element的By定位

除了上述的8種定位方法,Selenium還提供了一個通用的方法find_element(),這個方法有兩個參數:定位方式和定位值。

# 使用前先導入By類
from selenium.webdriver.common.by import By

以上的操作可以等同于以下:

browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'input')
browser.find_element(By.LINK_TEXT,'新聞')
browser.find_element(By.PARTIAL_LINK_TEXT,'聞')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')
3.10. 多個元素

如果定位的目標元素在網頁中不止一個,那么則需要用到find_elements,得到的結果會是列表形式。簡單來說,就是element后面多了復數標識s,其他操作一致。

4. 獲取頁面元素屬性

既然我們有很多方式來定位頁面的元素,那么接下來就可以考慮獲取以下元素的屬性了,尤其是用Selenium進行網絡爬蟲的時候。

4.1. get_attribute獲取屬性

以百度首頁的logo為例,獲取logo相關屬性

<img?hidefocus="true"?id="s_lg_img"?class="index-logo-src"?src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png"?width="270"?height="129"?onerror="this.src='//www.baidu.com/img/flexible/logo/pc/index.png';this.onerror=null;"?usemap="#mp">

獲取logo的圖片地址

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  logo = browser.find_element_by_class_name('index-logo-src')
print(logo)
print(logo.get_attribute('src'))# 關閉瀏覽器
browser.close()

輸出:

<selenium.webdriver.remote.webelement.WebElement (session="e95b18c43a330745af019e0041f0a8a4", element="7dad5fc0-610b-45b6-b543-9e725ee6cc5d")>
https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
4.2. 獲取文本

以熱榜為例,獲取熱榜文本和鏈接

<a?class="title-content?tag-width?c-link?c-font-medium?c-line-clamp1"?href="https://www.baidu.com/s?cl=3&amp;tn=baidutop10&amp;fr=top1000&amp;wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&amp;rsv_idx=2&amp;rsv_dl=fyb_n_homepage&amp;sa=fyb_n_homepage&amp;hisfilter=1"?target="_blank"><span class="title-content-index?c-index-single?c-index-single-hot1">1</span><span class="title-content-title">各地貫徹十九屆六中全會精神紀實</span></a>

獲取熱榜的文本,用的是text屬性,直接調用即可

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a')
print(logo.text)
print(logo.get_attribute('href'))# 關閉瀏覽器
browser.close()

輸出:

1各地貫徹十九屆六中全會精神紀實
https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1
4.3. 獲取其他屬性

除了屬性和文本值外,還有id、位置、標簽名和大小等屬性。

from selenium import webdriver
import time  browser = webdriver.Chrome()browser.get(r'https://www.baidu.com')  logo = browser.find_element_by_class_name('index-logo-src')
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)# 關閉瀏覽器
browser.close()

輸出:

6af39c9b-70e8-4033-8a74-7201ae09d540
{'x': 490, 'y': 46}
img
{'height': 129, 'width': 270}

5. 頁面交互操作

頁面交互就是在瀏覽器的各種操作,比如上面演示過的輸入文本、點擊鏈接等等,還有像清除文本、回車確認、單選框與多選框選中等。

5.1. 輸入文本

其實,在之前的小節中我們有用過此操作。

send_keys()

from selenium import webdriver
import time  browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 輸入python
input.send_keys('python')
time.sleep(2)# 關閉瀏覽器
browser.close()
5.2. 點擊

同樣,我們也用過這個點擊操作。

click()

from selenium import webdriver
import time  browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 選中新聞按鈕
click = browser.find_element_by_link_text('新聞')
# 點擊之
click.click()
time.sleep(2)# 關閉瀏覽器全部頁面
browser.quit()
5.3. 清除文本

既然有輸入,這里也就有清除文本啦。

clear()

from selenium import webdriver
import time  browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 輸入python
input.send_keys('python')
time.sleep(2)
# 清除python
input.clear()
time.sleep(2)# 關閉瀏覽器
browser.close()

5.4. 回車確認

比如,在搜索框輸入文本python,然后回車就出查詢操作結果的情況。

submit()

from selenium import webdriver
import time  browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 輸入python
input.send_keys('python')
time.sleep(2)
# 回車查詢
input.submit()
time.sleep(5)# 關閉瀏覽器
browser.close()

5.5. 單選

單選比較好操作,先定位需要單選的某個元素,然后點擊一下即可。

5.6. 多選

多選好像也比較容易,依次定位需要選擇的元素,點擊即可。

5.7. 下拉框

下拉框的操作相對復雜一些,需要用到Select模塊。

先導入該類

from?selenium.webdriver.support.select?import?Select

select模塊中有以下定位方法

'''1、三種選擇某一選項項的方法'''select_by_index()           # 通過索引定位;注意:index索引是從“0”開始。
select_by_value()           # 通過value值定位,value標簽的屬性值。
select_by_visible_text()    # 通過文本值定位,即顯示在下拉框的值。'''2、三種返回options信息的方法'''options                     # 返回select元素所有的options
all_selected_options        # 返回select元素中所有已選中的選項
first_selected_options      # 返回select元素中選中的第一個選項                  '''3、四種取消選中項的方法'''deselect_all                # 取消全部的已選擇項
deselect_by_index           # 取消已選中的索引項
deselect_by_value           # 取消已選中的value值
deselect_by_visible_text    # 取消已選中的文本值

我們來進行演示一波,由于暫時沒找到合適的網頁,我這邊寫了一個簡單的網頁本地測試(文件存為 帥哥.html)

<html><body><form>
<select name="帥哥">
<option value="才哥">才哥</option>
<option value="小明" selected="">小明</option>
<option value="小華">小華</option>
<option value="草兒">小草</option>
</select>
</form></body>
</html>

然后,再演示下拉框的不同選擇的方式

from selenium import webdriver
from selenium.webdriver.support.select import Select
import timeurl = 'file:///C:/Users/Gdc/Desktop/帥哥.html'browser = webdriver.Chrome()browser.get(url)
time.sleep(2)# 根據索引選擇
Select(browser.find_element_by_name("帥哥")).select_by_index("2")
time.sleep(2)
# 根據value值選擇
Select(browser.find_element_by_name("帥哥")).select_by_value("草兒")
time.sleep(2)
# 根據文本值選擇
Select(browser.find_element_by_name("帥哥")).select_by_visible_text("才哥")
time.sleep(2)# 關閉瀏覽器
browser.close()

6. 多窗口切換

比如同一個頁面的不同子頁面的節點元素獲取操作,不同選項卡之間的切換以及不同瀏覽器窗口之間的切換操作等等。

6.1. Frame切換

Selenium打開一個頁面之后,默認是在父頁面進行操作,此時如果這個頁面還有子頁面,想要獲取子頁面的節點元素信息則需要切換到子頁面進行擦走,這時候switch_to.frame()就來了。如果想回到父頁面,用switch_to.parent_frame()即可。

6.2. 選項卡切換

我們在訪問網頁的時候會打開很多個頁面,在Selenium中提供了一些方法方便我們對這些頁面進行操作。

current_window_handle:獲取當前窗口的句柄。

window_handles:返回當前瀏覽器的所有窗口的句柄。

switch_to_window():用于切換到對應的窗口。

from selenium import webdriver
import timebrowser = webdriver.Chrome()# 打開百度
browser.get('http://www.baidu.com')
# 新建一個選項卡
browser.execute_script('window.open()')
print(browser.window_handles)
# 跳轉到第二個選項卡并打開知乎
browser.switch_to.window(browser.window_handles[1])
browser.get('http://www.zhihu.com')
# 回到第一個選項卡并打開淘寶(原來的百度頁面改為了淘寶)
time.sleep(2)
browser.switch_to.window(browser.window_handles[0])
browser.get('http://www.taobao.com')

7. 模擬鼠標操作

既然是模擬瀏覽器操作,自然也就需要能模擬鼠標的一些操作了,這里需要導入ActionChains?類。

from?selenium.webdriver.common.action_chains?import?ActionChains
7.1. 左鍵

這個其實就是頁面交互操作中的點擊click()操作。

7.2. 右鍵

context_click()

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time  browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 定位到要右擊的元素,這里選的新聞鏈接
right_click = browser.find_element_by_link_text('新聞')# 執行鼠標右鍵操作
ActionChains(browser).context_click(right_click).perform()
time.sleep(2)# 關閉瀏覽器
browser.close()

在上述操作中

ActionChains(browser):調用ActionChains()類,并將瀏覽器驅動browser作為參數傳入

context_click(right_click):模擬鼠標雙擊,需要傳入指定元素定位作為參數

perform():執行ActionChains()中儲存的所有操作,可以看做是執行之前一系列的操作

7.3. 雙擊

double_click()

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time  browser = webdriver.Chrome()
browser.get(r'https://www.baidu.com')  
time.sleep(2)# 定位到要雙擊的元素
double_click = browser.find_element_by_css_selector('#bottom_layer > div > p:nth-child(8) > span')# 雙擊
ActionChains(browser).double_click(double_click).perform()
time.sleep(15)# 關閉瀏覽器
browser.close()

7.4. 拖拽

drag_and_drop(source,target)拖拽操作嘛,開始位置和結束位置需要被指定,這個常用于滑塊類驗證碼的操作之類。

我們以菜鳥教程的一個案例來進行演示

https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time  browser = webdriver.Chrome()
url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)  
time.sleep(2)browser.switch_to.frame('iframeResult')# 開始位置
source = browser.find_element_by_css_selector("#draggable")# 結束位置
target = browser.find_element_by_css_selector("#droppable")# 執行元素的拖放操作
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
# 拖拽
time.sleep(15)# 關閉瀏覽器
browser.close()

7.5. 懸停

move_to_element()

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time  browser = webdriver.Chrome()
url = 'https://www.baidu.com'
browser.get(url)  
time.sleep(2)# 定位懸停的位置
move = browser.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap > span.soutu-btn")# 懸停操作
ActionChains(browser).move_to_element(move).perform()
time.sleep(5)# 關閉瀏覽器
browser.close()

8. 模擬鍵盤操作

selenium中的Keys()類提供了大部分的鍵盤操作方法,通過send_keys()方法來模擬鍵盤上的按鍵。

引入Keys

from?selenium.webdriver.common.keys?import?Keys

常見的鍵盤操作

send_keys(Keys.BACK_SPACE):刪除鍵(BackSpace)

send_keys(Keys.SPACE):空格鍵(Space)

send_keys(Keys.TAB):制表鍵(TAB)

send_keys(Keys.ESCAPE):回退鍵(ESCAPE)

send_keys(Keys.ENTER):回車鍵(ENTER)

send_keys(Keys.CONTRL,'a'):全選(Ctrl+A)

send_keys(Keys.CONTRL,'c'):復制(Ctrl+C)

send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)

send_keys(Keys.CONTRL,'v'):粘貼(Ctrl+V)

send_keys(Keys.F1):鍵盤F1

.....

send_keys(Keys.F12):鍵盤F12

實例操作演示:

定位需要操作的元素,然后操作即可!

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import timebrowser = webdriver.Chrome()
url = 'https://www.baidu.com'
browser.get(url)  
time.sleep(2)# 定位搜索框
input = browser.find_element_by_class_name('s_ipt')
# 輸入python
input.send_keys('python')
time.sleep(2)# 回車
input.send_keys(Keys.ENTER)
time.sleep(5)# 關閉瀏覽器
browser.close()

9. 延時等待

如果遇到使用ajax加載的網頁,頁面元素可能不是同時加載出來的,這個時候嘗試在get方法執行完成時獲取網頁源代碼可能并非瀏覽器完全加載完成的頁面。所以,這種情況下需要設置延時等待一定時間,確保全部節點都加載出來。

三種方式可以來玩玩:強制等待、隱式等待和顯式等待

9.1. 強制等待

就很簡單了,直接time.sleep(n)強制等待n秒,在執行get方法之后執行。

9.2. 隱式等待

implicitly_wait()設置等待時間,如果到時間有元素節點沒有加載出來,就會拋出異常。

from selenium import webdriverbrowser = webdriver.Chrome()# 隱式等待,等待時間10秒
browser.implicitly_wait(10)  browser.get('https://www.baidu.com')
print(browser.current_url)
print(browser.title)# 關閉瀏覽器
browser.close()
9.3. 顯式等待

設置一個等待時間和一個條件,在規定時間內,每隔一段時間查看下條件是否成立,如果成立那么程序就繼續執行,否則就拋出一個超時異常。

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import timebrowser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# 設置等待時間10s
wait = WebDriverWait(browser, 10)
# 設置判斷條件:等待id='kw'的元素加載完成
input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
# 在關鍵詞輸入:關鍵詞
input.send_keys('Python')# 關閉瀏覽器
time.sleep(2)
browser.close()

WebDriverWait的參數說明

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)

driver: 瀏覽器驅動

timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)

poll_frequency: 每次檢測的間隔時間,默認是0.5秒

ignored_exceptions:超時后的異常信息,默認情況下拋出NoSuchElementException異常

until(method,message='')

method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False

message: 如果超時,拋出TimeoutException,將message傳入異常

until_not(method,message='')

until_not?與until相反,until是當某元素出現或什么條件成立則繼續執行,until_not是當某元素消失或什么條件不成立則繼續執行,參數也相同。

其他等待條件

from selenium.webdriver.support import expected_conditions as EC# 判斷標題是否和預期的一致
title_is
# 判斷標題中是否包含預期的字符串
title_contains# 判斷指定元素是否加載出來
presence_of_element_located
# 判斷所有元素是否加載完成
presence_of_all_elements_located# 判斷某個元素是否可見. 可見代表元素非隱藏,并且元素的寬和高都不等于0,傳入參數是元組類型的locator
visibility_of_element_located
# 判斷元素是否可見,傳入參數是定位后的元素WebElement
visibility_of
# 判斷某個元素是否不可見,或是否不存在于DOM樹
invisibility_of_element_located# 判斷元素的 text 是否包含預期字符串
text_to_be_present_in_element
# 判斷元素的 value 是否包含預期字符串
text_to_be_present_in_element_value#判斷frame是否可切入,可傳入locator元組或者直接傳入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it#判斷是否有alert出現
alert_is_present#判斷元素是否可點擊
element_to_be_clickable# 判斷元素是否被選中,一般用在下拉列表,傳入WebElement對象
element_to_be_selected
# 判斷元素是否被選中
element_located_to_be_selected
# 判斷元素的選中狀態是否和預期一致,傳入參數:定位后的元素,相等返回True,否則返回False
element_selection_state_to_be
# 判斷元素的選中狀態是否和預期一致,傳入參數:元素的定位,相等返回True,否則返回False
element_located_selection_state_to_be#判斷一個元素是否仍在DOM中,傳入WebElement對象,可以判斷頁面是否刷新了
staleness_of

10. 其他

補充一些

10.1. 運行JavaScript

還有一些操作,比如下拉進度條,模擬javaScript,使用execute_script方法來實現。

from selenium import webdriverbrowser = webdriver.Chrome()
# 知乎發現頁
browser.get('https://www.zhihu.com/explore')browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

10.2. Cookie

selenium使用過程中,還可以很方便對Cookie進行獲取、添加與刪除等操作。

from selenium import webdriverbrowser = webdriver.Chrome()
# 知乎發現頁
browser.get('https://www.zhihu.com/explore')
# 獲取cookie
print(f'Cookies的值:{browser.get_cookies()}')
# 添加cookie
browser.add_cookie({'name':'才哥', 'value':'帥哥'})
print(f'添加后Cookies的值:{browser.get_cookies()}')
# 刪除cookie
browser.delete_all_cookies()
print(f'刪除后Cookies的值:{browser.get_cookies()}')

輸出:

Cookies的值:[{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com', ...]
添加后Cookies的值:[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '才哥', 'path': '/', 'secure': True, 'value': '帥哥'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com',...]
刪除后Cookies的值:[]
10.3. 反屏蔽

發現美團直接給Selenium給屏蔽了,不知道怎么搞!!

以上就是本次全部內容,如果覺得有幫助,還請點贊呀!

最后感謝每一個認真閱讀我文章的人,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走:

這些資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!凡事要趁早,特別是技術行業,一定要提升技術功底。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/83693.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/83693.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/83693.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

結構性設計模式之Facade(外觀)設計模式

結構性設計模式之Facade&#xff08;外觀&#xff09;設計模式 前言&#xff1a; 外觀模式&#xff1a;用自己的話理解就是用戶看到是一個總體頁面&#xff0c;比如xx報名系統頁面。里面有歷年真題模塊、報名模塊、教程模塊、首頁模塊… 做了一個各個模塊的合并&#xff0c;對…

RabbitMQ實用技巧

RabbitMQ是一個流行的開源消息中間件&#xff0c;廣泛用于實現消息傳遞、任務分發和負載均衡。通過合理使用RabbitMQ的功能&#xff0c;可以顯著提升系統的性能、可靠性和可維護性。本文將介紹一些RabbitMQ的實用技巧&#xff0c;包括基礎配置、高級功能及常見問題的解決方案。…

Linux(10)——第二個小程序(自制shell)

目錄 ?編輯 一、引言與動機 &#x1f4dd;背景 &#x1f4dd;主要內容概括 二、全局數據 三、環境變量的初始化 ? 代碼實現 四、構造動態提示符 ? 打印提示符函數 ? 提示符生成函數 ?獲取用戶名函數 ?獲取主機名函數 ?獲取當前目錄名函數 五、命令的讀取與…

環境變量深度解析:從配置到內核的全鏈路指南

文章目錄 一、基礎概念與核心作用二、常見環境變量三、操作指南&#xff1a;從查看、修改到調試3.1 快速查詢3.2 PATH 原理與配置實踐3.2.1 命令執行機制3.2.2 路徑管理策略 四、編程接口與內存模型4.1 環境變量的內存結構4.2 C 語言訪問方式4.2.1 直接訪問&#xff08;main 參…

結合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自動化實戰指南

基于最佳實踐的Spring Boot自動化部署實戰指南,結合Jenkins、Docker和Kubernetes等主流工具,提供從環境搭建到生產部署的完整流程: 一、環境準備與工具選型?? ??1.基礎設施?? ??Jenkins服務器??:安裝Jenkins LTS版本,配置JDK(推薦JDK 11+)及Maven/Gradle插…

動態規劃---股票問題

1.在推狀態轉移方程的途中&#xff0c;箭頭的起始點表示前一天的狀態&#xff0c;箭頭的終點是當天的狀態 2.當動態規劃中涉及到多狀態&#xff0c;且狀態之間可以相互轉換&#xff0c;要畫圖去分析 1.買賣股票的最佳時機含冷凍期 題目鏈接&#xff1a;309. 買賣股票的最佳時機…

ObjectMapper 在 Spring 統一響應處理中的作用詳解

ObjectMapper 是 Jackson 庫的核心類&#xff0c;專門用于處理 JSON 數據的序列化&#xff08;Java 對象 → JSON&#xff09;和反序列化&#xff08;JSON → Java 對象&#xff09;。在你提供的代碼中&#xff0c;它解決了字符串響應特殊處理的關鍵問題。 一、為什么需要 Obj…

總結這幾個月來我和AI一起開發并上線第一個應用的使用經驗

副標題&#xff1a; 當“手殘”前端遇到AI隊友&#xff0c;我的音樂小站譜貝誕生記 大家好&#xff0c;我最近干了件“不務正業”的事——**獨立開發并上線了一個完整的網站 作為一個前端“手殘黨”&#xff08;還在努力學習中&#x1f605;&#xff09;&#xff0c;這次能成功…

【大模型:知識圖譜】--5.neo4j數據庫管理(cypher語法2)

目錄 1.節點語法 1.1.CREATE--創建節點 1.2.MATCH--查詢節點 1.3.RETURN--返回節點 1.4.WHERE--過濾節點 2.關系語法 2.1.創建關系 2.2.查詢關系 3.刪除語法 3.1.DELETE 刪除 3.2.REMOVE 刪除 4.功能補充 4.1.SET &#xff08;添加屬性&#xff09; 4.2.NULL 值 …

結構體指針與非指針 問題及解決

問題描述 第一段位于LCD.h和LCD.c中&#xff0c; 定義個一個結構體lcd_params&#xff0c;并直接給與指針名*p_lcd_params; 我發現我在調用這個結構體時&#xff0c;即在LCD.c中&#xff0c;使用指針類型定義的 static p_lcd_params p_array_lcd[LCD_NUM]; static p_lcd_par…

【設計模式-3.7】結構型——組合模式

說明&#xff1a;本文介紹結構型設計模式之一的組合模式 定義 組合模式&#xff08;Composite Pattern&#xff09;又叫作整體-部分&#xff08;Part-Whole&#xff09;模式&#xff0c;它的宗旨是通過將單個對象&#xff08;葉子節點&#xff09;和組合對象&#xff08;樹枝…

【TMS570LC4357】之相關驅動開發學習記錄2

系列文章目錄 【TMS570LC4357】之工程創建 【TMS570LC4357】之工程配置修改 【TMS570LC4357】之HALCOGEN使用 【TMS570LC4357】之相關問題及解決 【TMS570LC4357】之相關驅動開發學習記錄1 ——————————————————— 前言 記錄筆者在第一次使用TMS570過程中對…

3D Gaussian splatting 05: 代碼閱讀-訓練整體流程

目錄 3D Gaussian splatting 01: 環境搭建3D Gaussian splatting 02: 快速評估3D Gaussian splatting 03: 用戶數據訓練和結果查看3D Gaussian splatting 04: 代碼閱讀-提取相機位姿和稀疏點云3D Gaussian splatting 05: 代碼閱讀-訓練整體流程3D Gaussian splatting 06: 代碼…

【黑馬程序員uniapp】項目配置、請求函數封裝

黑馬程序員前端項目uniapp小兔鮮兒微信小程序項目視頻教程&#xff0c;基于Vue3TsPiniauni-app的最新組合技術棧開發的電商業務全流程_嗶哩嗶哩_bilibili 參考 有代碼&#xff0c;還有app、h5頁面、小程序的演示 小兔鮮兒-vue3ts-uniapp-一套代碼多端部署: 小兔鮮兒-vue3ts-un…

前端使用 preview 插件預覽docx文件

目錄 前言一 引入插件二 JS 處理 前言 前端使用 preview 插件預覽docx文件 一 引入插件 建議下載至本地&#xff0c;靜態引入&#xff0c;核心的文件已打包&#xff08;前端使用 preview 插件預覽docx文件&#xff09;&#xff0c;在文章目錄處下載至本地&#xff0c;復制在項…

如何在運動中保護好半月板?

文章目錄 引言I 半月板的作用穩定作用緩沖作用潤滑作用II 在跳繩運動中保護好半月板III 半月板損傷自測IV 半月板“殺手”半月板損傷必須滿足四個因素:消耗品引言 膝蓋是連接大腿骨和小腿骨的地方,在兩部分骨頭的連接處,墊著兩片半月形的纖維軟骨板,這就是半月板。半月板分…

安科瑞防逆流方案落地內蒙古中高綠能光伏項目,筑牢北疆綠電安全防線

一、項目概況 內蒙古阿拉善中高綠能能源分布式光伏項目&#xff0c;位于內蒙古烏斯太鎮&#xff0c;裝機容量為7MW&#xff0c;采用自發自用、余電不上網模式。 用戶配電站為35kV用戶站&#xff0c;采用兩路電源單母線分段系統。本項目共設置12臺35/0.4kV變壓器&#xff0c;在…

1.3 fs模塊詳解

fs 模塊詳解 Node.js 的 fs 模塊提供了與文件系統交互的能力&#xff0c;是服務器端編程的核心模塊之一。它支持同步、異步&#xff08;回調式&#xff09;和 Promise 三種 API 風格&#xff0c;可滿足不同場景的需求。 1. 模塊引入 const fs require(fs); // 回調…

LeetCode 70 爬樓梯(Java)

爬樓梯問題&#xff1a;動態規劃與斐波那契的巧妙結合 問題描述 假設你正在爬樓梯&#xff0c;需要爬 n 階才能到達樓頂。每次你可以爬 1 或 2 個臺階。求有多少種不同的方法可以爬到樓頂&#xff1f; 示例&#xff1a; n 2 → 輸出 2&#xff08;1階1階 或 2階&#xff0…

【學習分享】shell基礎-參數傳遞

參數傳遞 我們可以在執行 Shell 腳本時&#xff0c;向腳本傳遞參數&#xff0c;腳本內獲取參數的格式為 $n&#xff0c;n 代表一個數字&#xff0c;1 為執行腳本的第一個參數&#xff0c;2 為執行腳本的第二個參數。 例如可以使用 $1、$2 等來引用傳遞給腳本的參數&#xff0…