主頁 > 後端開發 > seleniumAPI常用操作大全&API再封裝

seleniumAPI常用操作大全&API再封裝

2021-03-01 10:58:08 後端開發

文章目錄

          • 物件創建
          • 瀏覽器操作
          • 頁面操作
          • 斷言assert操作
          • 元素定位的兩種方式
          • 元素的八種定位方法
          • 定位一組元素
          • 元素的操作
          • 多標簽之間的切換
          • 多表單的切換
          • 滑鼠常用操作
          • 鍵盤常用操作
          • 警告框操作
          • 下拉框操作
          • 呼叫JS代碼
          • 瀏覽器等待的三種方式
          • cookies操作

前置知識:
selenium環境搭建
CSS選擇器和Xpath選擇器

以下是常用的selenium API的操作方法,但筆者希望用起來更方便一些,所以封裝了常用的操作,檔案上傳到了附件中附件:API再封裝
封裝測驗

物件創建
# 匯入相關庫
from selenium import webdriver
import time

# 創建一個瀏覽器物件,其他的見環境搭建
driver = webdriver.Chrome()

# 查看所有方法
print(dir(driver))
瀏覽器操作
# 設定全屏
driver.maximize_window()
# 設定瀏覽器尺寸
driver.set_window_size(800,600)
# 獲取當前瀏覽器尺寸
size = driver.get_window_size()
print(size)

# 設定瀏覽器位置
driver.set_window_position(0,0)
# 獲取瀏覽器位置
position = driver.get_window_position()
print(position)

# 關閉當前標簽
# driver.close()
# 關閉所有標簽
# driver.quit()
頁面操作
# 請求某個url對應的回應
url = "https://www.baidu.com"
driver.get(url)
time.sleep(2)
driver.get("https://passport.csdn.net/login?code=public")
# 重繪頁面
time.sleep(2)
driver.refresh()
# 回退上一個頁面
time.sleep(2)
driver.back()
# 前進一個頁面
time.sleep(2)
driver.forward()
斷言assert操作
driver.get("https://passport.csdn.net/login?code=public")
# 獲取當前訪問頁url
print(driver.current_url)
# 獲取當前瀏覽器標題
print(driver.title)
# 保存快照
driver.get_screenshot_as_file("screeshot01.png") # 方式一
date = driver.get_screenshot_as_png() # 方式二 type(date) --> bytes
with open("screenshot02.png","wb") as f:
    f.write(date)
date64 = driver.get_screenshot_as_base64() # 方式三 type(date64) --> str
print(type(date64))
with open("screenshot03.png","w") as f:
    f.write(date64)
# 查看網頁原始碼
sourse = driver.page_source
with open("CSDN.html","wb") as f:
    f.write(sourse.encode()) # str to bytes
元素定位的兩種方式
driver.get("https://passport.csdn.net/login?code=public")
# 直接呼叫(推薦)
el_search = driver.find_element_by_id("toolbar-search-input") # webelement類實體化物件
print(dir(el_search)) # 查看element物件中的方法
el_search.send_keys("TEST") # 傳值
el_click = driver.find_element_by_id("toolbar-search-button")
el_click.click()

# 使用By型別
from selenium.webdriver.common.by import By
ele_search = driver.find_element(By.ID,"toolbar-search-input")
ele_search.send_keys("TEST")
ele_click = driver.find_element(By.ID,"toolbar-search-button")
ele_click.click()
元素的八種定位方法
'''
(以下用第一種定位方式舉例)
'''
driver.get("https://passport.csdn.net/login?code=public")
driver.find_element_by_css_selector("#app > div > div > div.main > div.main-login > div.main-select > ul > li:nth-child(2) > a").click() #使用賬號密碼登錄
# id定位
el_by_id = driver.find_element_by_id("toolbar-search-input")
el_by_id.send_keys("TestID")
# name屬性值定位
el_by_name = driver.find_element_by_name("pwd")
el_by_name.send_keys("TestName")
# 偽類名定位
el_by_className = driver.find_element_by_class_name("user-service-link")
el_by_className.click()
# 標簽名定位
el_by_tagName = driver.find_element_by_tag_name("input")
el_by_tagName.send_keys("TestTagName")
# 鏈接文本定位(注意是文本,不是href;selenium會自動補全相對鏈接地址)
el_by_linkText = driver.find_element_by_link_text("首頁")
el_by_linkText.click()
# 部分鏈接文本
el_by_partialLinkText = driver.find_element_by_partial_link_text("首")
el_by_partialLinkText.click()
# xpath路徑運算式(注意單雙引號區分)
el_by_xpath = driver.find_element_by_xpath('//*[@id="tabTwo"]')
el_by_xpath.click()
# css選擇器定位
el_by_css = driver.find_element_by_css_selector("#app > div > div > div.main > div.main-login > div.main-process-login > div > div.form-group.form-group-link > div > a")
el_by_css.click()
定位一組元素
'''
find_elements_by_xxx,回傳一個串列
視頻熱榜中的第一條記錄的css路徑:#floor-sp_66 > div > div.rank_list.sp_rank_wrap > ul > li:nth-child(1) > div > div > a > h4
改寫之后獲取所有記錄:#floor-sp_66 > div > div.rank_list.sp_rank_wrap > ul > li > div > div > a > h4

第一條xpath路徑://*[@id="floor-sp_66"]/div/div[2]/ul/li[1]/div/div/a/h4
改寫://*[@id="floor-sp_66"]/div/div[2]/ul/li/div/div/a/h4

其他幾種方法同理
'''
driver.get("https://www.csdn.net")
el_list = driver.find_elements_by_xpath('//*[@id="floor-sp_66"]/div/div[2]/ul/li/div/div/a/h4')
print(el_list)
元素的操作
# # 點擊
# element.click()
# # 清空和輸入(只能操作可輸入的文本框)
# element.clear()
# element.send_keys()
#
# # 提交
# element.submit()
#
# # 獲取文本內容
# element.text
# # 獲取屬性值
# element.get_attribute("attrName")
# # 獲取元素尺寸
# element.size
# # 獲取元素是否可見
# element.is_displayed()

# 例:獲取視頻熱榜中的標題
for el in el_list:
    print("標題:",el.text)
多標簽之間的切換
driver.get("https://www.csdn.net")
driver.find_element_by_link_text("Python").click()
driver.find_element_by_link_text("Java").click()
# 獲取所有視窗的句柄,回傳一個串列存盤每一個視窗句柄值
handles = driver.window_handles
# 通過視窗的句柄切換
time.sleep(2)
driver.switch_to.window(handles[0])
print(driver.title)
多表單的切換
'''
iframe/frame --> 參考了其他頁面的鏈接,但真正的頁面資料并不出現在當前頁面原始碼中
'''
driver.get("https://mail.163.com")
el_frame = driver.find_element_by_tag_name("iframe") # 有反爬措施,id會改變
print(el_frame)

# 切換進入表單中
time.sleep(2)
driver.switch_to.frame(el_frame) # 方式一:先定位,后切換
# driver.switch_to.frame("id") # 方式二:也可以直接使用id進行切換(如果有固定id的話)

el_user = driver.find_element_by_name("email")
el_user.send_keys("TestUser")

# 切換進入最外層頁面
driver.switch_to.default_content()
# 切換進入上層頁面
driver.switch_to.parent_frame()
滑鼠常用操作
'''
滑鼠常用操作 ActionChains()類
'''
driver.get("https://www.csdn.net")
from selenium.webdriver import ActionChains

el_logo = driver.find_element_by_css_selector("#csdn-toolbar > div > div > div.toolbar-container-left > div > a > img")
# 滑鼠右擊操作,操作前需要將元素定位出來并傳入相應的動作中;如果要執行操作,需要呼叫perform()
ActionChains(driver).context_click(el_logo).perform()
# 滑鼠雙擊操作
ActionChains(driver).double_click(el_logo).perform()

el_float = driver.find_element_by_css_selector("#floor-sp_66 > div > div.card_list.sp_card_wrap > div.card_list_wrap > div:nth-child(1) > a > div > div.video > div")
# 滑鼠懸停操作
time.sleep(2)
ActionChains(driver).move_to_element(el_float).perform()
鍵盤常用操作
'''
鍵盤常用操作 Keys類配合send_keys使用
'''
driver.get("https://www.csdn.net")
el_search = driver.find_element_by_id("toolbar-search-input")
el_search.send_keys("selenium")

from selenium.webdriver.common.keys import Keys
# 全選
time.sleep(1)
el_search.send_keys(Keys.CONTROL,"a")
# 剪切
time.sleep(1)
el_search.send_keys(Keys.CONTROL,"x")
# 粘貼
time.sleep(1)
el_search.send_keys("hello "+Keys.CONTROL,"v")
# 洗掉
el_search.send_keys(Keys.BACKSPACE) # BACK_SPACE = BACKSPACE
警告框操作
driver.get("https://www.baidu.com")

driver.find_element_by_id("s-usersetting-top").click()
driver.find_element_by_class_name("setpref").click()
time.sleep(2)
driver.find_element_by_css_selector("#se-setting-7 > a.prefpanelgo.setting-btn.c-btn.c-btn-primary").click()

# 進入警告框中
driver.switch_to.alert()
# 進入警告框中,并點擊接受
time.sleep(2)
driver.switch_to.alert.accept()
# 進入警告框中,并解散警告框
time.sleep(2)
driver.switch_to.alert.dismiss()
# 發送文本到警告框
# driver.switch_to.alert.send_keys("data")
下拉框操作
'''
下拉框操作 Select類,需要傳入物件
'''
driver.get("https://cn.bing.com")
time.sleep(3)
driver.find_element_by_xpath('//*[@id="id_sc"]').click()
time.sleep(1)
driver.find_element_by_css_selector("#hbsettings > div > div.hb_title_col").click()
time.sleep(1)
driver.find_element_by_css_selector("#hbsettree > a:nth-child(4) > div > div.hb_title_col").click()

from selenium.webdriver.support.select import Select
time.sleep(1)
ele_select = driver.find_element_by_id("rpp")
# 將定位到的下拉框元素傳入Select類中
selObj = Select(ele_select)
# 呼叫相應方法選擇下拉框中的選項
time.sleep(1)
selObj.select_by_index("0") # 通過索引選擇,str
time.sleep(1)
selObj.select_by_value("10") # 通過value值選擇
time.sleep(1)
selObj.select_by_visible_text("50") # 通過文本選擇

all = selObj.all_selected_options # 查看所有已選
first = selObj.first_selected_option # 查看第一個已選
isMu = selObj.is_multiple # 查看是否多選
opt = selObj.options # 查看選項元素串列
print(all,first,isMu,opt)
呼叫JS代碼
driver.get("https://www.csdn.net")
# 頁面滾動
js1 = "window.scrollTo(0,2000)"
js2 = "var q = document.documentElement.scrollTop = 500"
driver.execute_script(js1)
time.sleep(2)
driver.execute_script(js2)

# 回圈下拉滾動
for i in range(20):
    js = "window.scrollTo(0,%s)" %(i*100)
    driver.execute_script(js)
    time.sleep(0.5)
瀏覽器等待的三種方式
'''
瀏覽器等待
三種方式:
1.顯式等待 --> 根據條件進行等待,等待條件出現
2.隱式等待(推薦) --> 嘗試發現某個元素的時候,如果沒能立刻發現,就等待固定長度的時間
3.固定等待 --> time.sleep,即使加載完了也要等待,浪費時間
'''
driver.get("https://www.csdn.net")
# 顯式等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver,timeout=10,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,"toolbar-search-input"))) # 在設定的時間內,默認每隔一段時間檢測一次當前頁面元素是否存在,如果超過時間檢測不到則拋出例外

# 隱式等待
driver.implicitly_wait(10) # 單位為秒,為最大值;在這個最大值內只要定位到就結束等待,否則報錯
cookies操作
driver.get("https://www.csdn.net")
# 獲取cookies --> 字典dict格式
cookies = driver.get_cookies()
print(cookies)
# 獲取key對應的值
# driver.get_cookie(keyName)
# 洗掉指定名稱的cookie
# driver.delete_cookie(name="xx")
# 洗掉所有cookies
driver.delete_all_cookies()
# 設定cookies
cookie = {'domain': '.csdn.net', 'expiry': 1645971310, 'httpOnly': False, 'name': 'Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac', 'path': '/', 'secure': False, 'value': '6525*1*10_18797500640-1614435306890-873769'}
driver.add_cookie(cookie)
print(driver.get_cookies())

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264842.html

標籤:python

上一篇:Python爬取《你好李煥英》貓眼實時票房

下一篇:爬蟲實戰系列(十二):多執行緒帶你看貓眼春節檔熱映電影資料

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more