申明:資料來源于網路及書本,通過理解、實踐、整理成學習筆記,
文章目錄
- 測驗環境搭建
- 自動化訪問百度
- 定位元素
- 控制瀏覽器
- 簡單元素操作
- 滑鼠事件
- 鍵盤事件
- QQ郵箱登錄
- 設定元素等待
- 顯式等待
- 隱式等待
- expected_conditions類
測驗環境搭建
-
安裝python;
下載地址(https://www.python.org/)
安裝成功之后打開cmd輸入如下代碼顯示python安裝成功C:\Users\1>python Python 3.9.2 (tags/v3.9.2:1a79785, Feb 19 2021, 13:44:55) [MSC v.1928 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. -
安裝pip;
安裝成功之后打開cmd輸入如下代碼顯示pip安裝成功C:\Users\1>pip -V pip 20.2.3 from d:\python\lib\site-packages\pip (python 3.9) -
安裝Selenium;
打開cmd輸入如下代碼顯示pip安裝成功C:\Users\1>pip install selenium Collecting selenium Downloading selenium-3.141.0-py2.py3-none-any.whl (904 kB) |████████████████████████████████| 904 kB 16 kB/s Collecting urllib3 Downloading urllib3-1.26.4-py2.py3-none-any.whl (153 kB) |████████████████████████████████| 153 kB 2.0 kB/s Installing collected packages: urllib3, selenium Successfully installed selenium-3.141.0 urllib3-1.26.4 WARNING: You are using pip version 20.2.3; however, version 21.0.1 is available. You should consider upgrading via the 'd:\python\python.exe -m pip install --upgrade pip' command. -
下載瀏覽器驅動防止python檔案夾下
谷歌瀏覽器驅動:https://npm.taobao.org/mirrors/chromedriver/
火狐瀏覽器驅動:https://npm.taobao.org/mirrors/geckodriver/
IE瀏覽器驅動:http://selenium-release.storage.googleapis.com/index.html

自動化訪問百度
-
*防止亂碼,支持中文(必要)
# coding=utf-8 -
*匯入Selenium的WebDriver包(必要)
from selenium import webdriver -
*獲取瀏覽器物件(必要)
driver = webdriver.Chrome() #獲取谷歌瀏覽器 #driver = webdriver.Firefox() #獲取火狐瀏覽器 #driver = webdriver.Ie() #獲取IE瀏覽器 -
*向瀏覽器發送網址(URL)
# 向瀏覽器輸入百度的網址 driver.get("https://www.baidu.com")
定位元素
=以下實體都以百度網站為例=
-
id定位
find_element_by_id()# 使用id定位百度搜索框 driver.find_element_by_id("kw") -
name定位
find_element_by_name()# 使用name定位百度搜索框 driver.find_element_by_name("wd") -
class定位
find_element_by_class_name()# 使用class定位百度搜索框 driver.find_element_by_class_name("s_ipt") -
tag定位
find_element_by_tag_name()driver.find_element_by_tag_name("") -
link定位:定位文本鏈接,使用link通過元素標簽對之間的文本資訊來定位元素
find_element_by_link_text()# 使用link定位百度搜索框上的百度新聞 driver.find_element_by_link_text("新聞") -
partial link定位:parial link定位是對link定位的一種補充,有些文本鏈接會比較長,這個時候我們可以取文本鏈接的一部分定位,只要這一部分資訊可以唯一地標識這個鏈接,
find_element_by_partial_link_text()# 使用partial link定位百度搜索框上的百度新聞 driver.find_element_by_partial_link_text("新") -
XPath定位:元素的路徑定位
find_element_by_xpath()# 使用XPath定位百度搜索框 driver.find_element_by_xpath("//*[@id=\"kw\"]") -
CSS定位:可較為靈活的選擇控制元件的任意屬性,一般情況定位速度比Xpath快
find_element_by_css_selector()# 使用CSS定位百度搜索框 driver.find_element_by_css_selector("#kw")選擇器 例子 描述 .class .intro class選擇器,選擇class="intro"的所有元素 #id #firstname id選擇器,選擇id="firstname"的所有元素 * * 選擇所有元素 lement p 所有 <p>元素lement>element div>input 選擇元素為 元素之后的所有元素lement+element div+input 選擇同一級中緊接在 元素之后的所有元素attribute=value] [target=_blank] 選擇
控制瀏覽器
-
控制瀏覽器視窗大小
# 設定瀏覽器寬1920、高1080顯示 driver.set_windows_size(1920,1080) -
控制瀏覽器全屏顯示
driver.maximize_window() -
控制瀏覽器后退
driver.back() -
控制瀏覽器前進
driver.forward() -
模擬瀏覽器重繪
driver.refresh() -
退出并關閉瀏覽器及相關的驅動程式
driver.quit()
簡單元素操作
-
單擊元素
click()# 定位百度搜索框,輸入周星馳 driver.find_element_by_id("kw").send_keys("周星馳") # 定位百度一下的搜索按鈕并點擊 driver.find_element_by_id("su").click() -
模擬按鍵輸入
*send_keys(value)# 定位百度搜索框,輸入周星馳 driver.find_element_by_id("kw").send_keys("周星馳") -
清除文本
clear()# 定位百度搜索框,清除輸入框的內容 driver.find_element_by_id("kw").clear() -
提交表單,模擬“回車”操作,可以用來提交搜索框的內容、提交按鈕
submit()# 定位百度搜索框,輸入周星馳 driver.find_element_by_id("kw").send_keys("周星馳") # 提交表單,開始搜索 driver.find_element_by_id("kw").submit() -
獲取元素的尺寸
size# 獲取百度搜索框的尺寸 print(driver.find_element_by_id("kw").size) 執行結果: {'height': 44, 'width': 548} -
獲取元素的文本文字
text# 獲取百度頁面底部備案資訊的文本 print(driver.find_element_by_css_selector("#bottom_layer > div > p:nth-child(8) > a").text) 執行結果: 京公網安備11000002000001號 -
獲取元素任意屬性的屬性值
get_attribute(name)# 獲取百度搜索框type屬性和class屬性的屬性值 print(driver.find_element_by_id("kw").get_attribute('name')) print(driver.find_element_by_id("kw").get_attribute('id')) 執行結果: wd kw -
獲取該元素是否可見
is_displayed()# 獲取百度搜索框是否可見 print(driver.find_element_by_id("kw").is_displayed()) 執行結果: true
滑鼠事件
- 匯入提供滑鼠操作的ActionChains類
from selenium.webdriver import ActionChains
ActionChains(driver):呼叫ActionChains類,將瀏覽器驅動driver作為引數傳入,
perform():執行所有ActionChains中存盤的行為,可以理解成是對整個操作的提交動作,
-
滑鼠右擊
context_click()方法用于模擬滑鼠右鍵操作,在呼叫時需要指定元素定位,# 定位需要右擊的位置 right_click = driver.find_element_by_id("lg") # 對定位的位置進行滑鼠右擊操作 ActionChains(driver).context_click(right_click).perform() -
滑鼠懸停
move_to_element()方法可以模擬滑鼠懸停的動作,在呼叫時需要指定元素定位,# 定位到百度上方的“更多”導航欄上 above = driver.find_element_by_css_selector("#s-top-left > div > a") # 在導航欄“更多”上進行滑鼠懸浮操作 ActionChains(driver).move_to_element(above).perform() -
滑鼠雙擊
double_click()方法可以模擬滑鼠雙擊的動作,在呼叫時需要指定元素定位,# 定位到百度上方的“更多”導航欄上 double_click = driver.find_element_by_css_selector("#s-top-left > div > a") # 在導航欄“更多”上進行滑鼠雙擊操作,打開兩個百度產品大全 ActionChains(driver).double_click(double_click).perform() -
滑鼠拖放
drag_and_drop(element, target)在源元素上按住滑鼠左鍵,然后移動到目標元素上釋放,element = driver.find_element_by_id("xxx") target = driver.find_element_by_id("xxx") ActionChains(driver).drag_and_drop(element, target).perform()
鍵盤事件
-
匯入提供鍵盤操作的Keys模塊
from selenium.webdriver.common.keys import Keys -
洗掉鍵(BackSpace)
send_keys(Keys.BACK_SPACE) -
空格鍵(Space)
send_keys(Keys.SPACE) -
制表鍵(Tab)
send_keys(Keys.TAB) -
回退鍵(Esc)
send_keys(Keys.ESCAPE) -
回車鍵(Enter)
send_keys(Keys.ENTER) -
Shift鍵
send_keys(Keys.SHIFT) -
全選(Ctrl+A)
send_keys(Keys.CONTROL, 'a') -
復制(Ctrl+C)
send_keys(Keys.CONTROL, 'c') -
剪切(Ctrl+X)
send_keys(Keys.CONTROL, 'x') -
粘貼(Ctrl+V)
send_keys(Keys.CONTROL, 'v') -
鍵盤F1
send_keys(Keys.F1)
QQ郵箱登錄
- 程式代碼
from selenium import webdriver # from selenium.webdriver import ActionChains # from selenium.webdriver.common.keys import Keys import time driver = webdriver.Chrome() driver.get("https://mail.qq.com/") print("==========登錄前==========") # 列印當前頁面title currentTitle = driver.title print(currentTitle) # 列印當前頁面URL currentURL = driver.current_url print(currentURL) # 定位login_frame driver.switch_to.frame("login_frame") # 執行QQ郵箱登錄 driver.find_element_by_css_selector("#switcher_plogin").click() driver.find_element_by_id("u").clear() driver.find_element_by_id("u").send_keys("1572265659") driver.find_element_by_id("p").clear() driver.find_element_by_id("p").send_keys("QQ密碼") driver.find_element_by_id("login_button").click() time.sleep(5) print("==========登錄后==========") # 再次列印當前頁面title print(driver.title) # 再次列印當前頁面URL print(driver.current_url) if driver.title != currentTitle and driver.current_url != currentURL: print("==========登錄成功==========") else: print("==========登錄失敗==========") - 執行結果
D:\Python\python.exe E:/Python/Automate/BaiduLogin.py ==========登錄前========== 登錄QQ郵箱 https://mail.qq.com/ ==========登錄后========== QQ郵箱 https://mail.qq.com/cgi-bin/frame_html?sid=XeatV4kpGK7GH0Ii&r=a2ece68ab7413801f5498383904acee3 ==========登錄成功==========
設定元素等待
WebDriver 提供了兩種型別的等待:顯式等待和隱式等待,
顯式等待
顯式等待使 WebdDriver等待某個條件成立時繼續執行,否則在達到最大時長時拋棄超時例外(TimeoutException) ,
-
匯入By類
from selenium.webdriver.common.by import By -
匯入WebDriverWait類
from selenium.webdriver.support.ui import WebDriverWait -
匯入expected_conditions類
from selenium.webdriver.support import expected_conditions as EC -
顯式等待實體
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("http://www.baidu.com") element = WebDriverWait(driver, 5, 0.5) .until(EC.presence_of_element_located((By.ID, "kw"))) print(element) driver.quit()WebDriverWait(driver=driver, timeout=5, poll_frequency=0.5, ignored_exceptions=None) WebDriverWait引數: driver:瀏覽器驅動 timeout:最長超時時間,默認單位為秒 poll_frequency:檢測的間隔(步長)時間,默認為0.5s ignored_exceptions:超時后的例外資訊,默認情況下拋 NoSuchElementException例外, until(method=EC.presence_of_element_located((By.ID, "kw")),message=None) 呼叫until()方法提供的驅動程式作為一個引數,直到回傳值為True presence_of_element_located()方法判斷元素是否存在, until_not(method=EC.presence_of_element_located((By.ID, "kw")),message=None) 呼叫until_not()方法提供的驅動程式作為一個引數,直到回傳值為False presence_of_element_located()方法判斷元素是否存在,
隱式等待
隱式等待是通過一定的時長等待頁面上某元素加載完成,如果超出了設定的時長元素還沒有被加載,則拋出 NoSuchElementException例外,WebDriver 提供了implicitly_wait()方法來實作隱式等待,默認設定為0,
- 匯入NoSuchElementException類
from selenium.common.exceptions import NoSuchElementException
- 隱式等待實體
from selenium.common.exceptions import NoSuchElementException
from time import ctime
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
try:
print(ctime())
driver.find_element_by_id("kw").send_keys("周星馳")
# driver.find_element_by_id("kw111").send_keys("周星馳")
except NoSuchElementException as e:
print(e)
finally:
print(ctime())
driver.quit()
如果代碼是driver.find_element_by_id("kw").send_keys("周星馳")
執行結果為:
Sun Apr 4 15:15:33 2021
Sun Apr 4 15:15:33 2021
如果代碼是driver.find_element_by_id("kw111").send_keys("周星馳")
執行結果為:
Sun Apr 4 15:17:30 2021
Message: no such element: Unable to locate element:
{"method":"css selector","selector":"[id="kw111"]"}
(Session info: chrome=89.0.4389.114)
Sun Apr 4 15:17:40 2021
結論:
如果代碼能正常執行,則不影響腳本的執行速度
如果代碼不能正常執行,則會等待10秒,拋出例外
expected_conditions類
-
title_is
判斷當前頁面的標題是否等于預期 -
title_contains
判斷當前頁面的標題是否包含預期字串 -
presence_of_element_located
判斷元素是否被加在 DOM樹里,并不代表該元素一定可見 -
visibilitiy_of_element_located
判斷元素是否可見(可見代表元素非隱藏,并且元素的寬和高都不等于0) -
visibilitiy_of
與上一個方法作用相同,只是上一個方法引數為定位,該方法接收的引數為定位后的元素 -
presence_of_all_elements_located
判斷是否至少有一個元素存在于DOM樹中,例如,在個頁面中有n個元素的class為“wp”,那么只要有一個存在就回傳True -
text_to_be_present_in_element
判斷某個元素中的 text是否包含了預期的字串 -
text_to_be_present_in_element_value
判斷某個元素的value屬性是否包含了預期的字串 -
frame_to_be_available_and_switch_to_it
判斷該表單是否可以切換進去、如果可以,回傳True并且 switch進去,否則回傳False -
invisibility_of_element_located
判斷某個元素是否不存在于DOM樹或不可見 -
element_to_be_clickable
判斷元素是否可見并且是可以點擊的 -
staleness_of
等到一個元素從 DOM樹中移除 -
element_to_be_selected
判斷某個元素是否被選中,一般用在下拉串列 -
element_selection_state_to_be
判斷某個元素的選中狀態是否符合預期 -
element_located_selection_state_to_be
與上一個方法作用相同,只是上一個方法引數為定位后的元素,該方法接收的引數為定位 -
alert_is_present
判斷頁面上是否存在alert
一個堅持學習,堅持成長,堅持分享的人,即使再不聰明,也一定會成為優秀的人!
整理不易,如果看完覺得有所識訓的話,記得一鍵三連哦,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/272487.html
標籤:python
下一篇:python批量管理文獻
