selenium webDriver的運用

2022-08-06 18:00:23

宣告範例執行瀏覽器

設定瀏覽器驅動後,可以通過簡單的2行程式碼就可以驅動瀏覽器(設定這裡不加贅述)

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

1.簡單操作

1.1瀏覽器操作

 

 

 

driver.back()#後退
driver.forward()#前進
driver.refresh()#重新整理
1.2瀏覽器視窗操作

 

 

 

driver.maximize_window()#瀏覽器最大化視窗
driver.minimize_window()#瀏覽器最小化視窗
driver.close()#關閉瀏覽器
driver.set_window_position(座標X,座標Y) #移動瀏覽器到座標位置
driver.set_window_size(寬度畫素,高度畫素)#講瀏覽器視窗設定指定大小
driver.set_window_rect(座標X,座標Y,寬度畫素,高度畫素)#將瀏覽器視窗移動到指定位置,同時設定視窗大小
1.3獲取瀏覽器資訊
print(driver.title) #百度一下,你就知道
print(driver.current_url) #https://www.baidu.com/
#獲取位置物件
driver.get_window_position()
#獲取大小物件
driver.get_window_size()
#獲取位置和大小物件
driver.get_window_rect()

2查詢頁面元素

#基本查詢元素
from selenium.webdriver.common.by import By

driver.find_element(By.ID,"kw").send_keys("")
driver.find_element(By.NAME,"wd").send_keys("")
driver.find_element(By.LINK_TEXT,"新聞").click()
xpath表示式
/子節點
//任意位置
*任意元素
.當前節點 ..父級極點
子節點穩定//*[@屬性=「屬性值」]/.. 這樣就可以向上找到節點在往上繼續/.. 然後往下找div[索引]
following-sibling::同節點最近的下一個(小哥)
preceding-sibling::同節點最近的上一個(大哥)
@代表屬性
格式
屬性://*[@屬性=「屬性值」]
文字://*[text()='文字值']
模糊查詢 [ contains(@屬性/text(),「值」)]
starts_with(@屬性/text(),「值」):以xxx開始 :屬性,文字值
多條件查詢and:
//*[@屬性=‘值’ and@屬性=‘值’ ]
svg元素
//*[name()='svg']

3元素基本操作

click

通常用於單擊按鈕(<button/>、<input type="reset"/>、<input type="submit">)、連結(<a/>)、單選框(<input type="radio"/>)、核取方塊(<input type="checkbox"/>)等元素,但實際上對於頁面上任何可見的元素,都可用click函數單擊

send_keys

該函數一般用於輸入框元素(<input type="text"/><input type="password"/><textarea/>)或檔案上傳元素(<input type="file"/>),但理論上可以對任何可輸入元素進行操作。

clear

和send_keys函數類似,clear函數多用於輸入框元素。例如在百度搜尋頁面,我們可以先在百度搜尋文字方塊中填入關鍵字,然後搜尋。如果之後要再搜尋其他關鍵字,就需要執行clear函數,先清空文字再輸入關鍵字

下拉框

下拉框分為單選下拉框(<Select/>)和多選列表框(<Select multiple= "multiple"/>)

from selenium.webdriver.support.select import Select
sel=Select(driver.find_element(By.NAME,"cat_id"))
sel.select_by_value("頁面元素value數位")
sel.select_by_index("使用下標")
sel.select_by_visible_text("根據文字選擇")
sel.deselect_all()#取消所有選
獲取元素的基本屬性
from selenium.webdriver.common.by import By
baiduNewsLink = driver.find_element(By.XPATH,"//*[text()='新聞']")
print(baiduNewsLink.text)#文字值
print(baiduNewsLink.tag_name)#標籤型別
print(baiduNewsLink.is_selected())#元素是否選中
print(baiduNewsLink.is_enabled())#元素是否可以編輯
print(baiduNewsLink.is_displayed())#元素是否已經顯示
處理瀏覽器彈框

彈窗一共有三類:alert(只有確定),confirm(有確定又取消),prompt(有確定有取消還可以輸入值) alert不是一個方法是一個屬性

ale=driver.switch_to.alert 
ale.accept()#點選確定 
ale.dismiss()#點選取消
多網頁切換
print(driver.current_window_handle)#列印當前正在操作的瀏覽器控制程式碼
print(driver.window_handles)#列印範例下的所有控制程式碼
driver.switch_to.window(driver.window_handles[0])#切換到第一個視窗控制程式碼

4等待機制

通過函數設定等待的超時時間

driver.set_page_load_timeout(最長等待秒數)

改函數是全域性設定,在整個範例週期都會生效

強制等待

強制等待很簡單,直接使用PYthon的time函數即可

如下表示3秒延遲

import time
time.sleep(3)

缺點:處理起來毫無彈性

元素級等待機制——隱式等待

這是Selenium最初版本就支援的等待方式。它的作用是在執行find_element...這類函數時增加一個寬限時間,它決定了查詢元素時的最長等待時間

driver.implicitly_wait(等待秒數)

缺點:

  1. 全域性使用
  2. 如果某個元素未定位到會完整的等待設定的最長時間,減緩了執行速度
  3. 很多頁面有較多的非同步重新整理和操作,很多元素是動態的,都需要等待,用隱式也不太好
元素級等待機制——顯式等待

元素級等待機制的最佳實踐方式是顯式等待,它是一種相當完美的等待機制。只需要指定條件判斷函數,Selenium會每隔一定時間檢測該條件是否成立。如果成立,就立刻執行下一步;否則,一直等待,直到超過最大等待時間,丟擲超時異常

WebDriverWait(範例,超時秒數,檢測時間間隔預設0.5秒)
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
#這種場景下更適合使用Lambda表示式定義匿名函數
# WebDriverWait(driver,10).until(條件判斷函數:等待到條件判斷函數返回True)
# WebDriverWait(driver,10).until_not(條件判斷函數:等待到條件判斷函數返回False)
WebDriverWait(driver,10).until(lambda p: p.find_element(By.XPATH,"//*[text()='新聞']").is_displayed)

5.ActionChains——操作鏈

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
ActionChains(driver).click(driver.find_element(By.XPATH,"//*[text()='新聞']")).perform()
  1. 使用操作鏈需要先匯入ActionChains物件
  2. ActionChains傳入webdriver範例
  3. 接著預約了單擊操作,看清楚這裡並沒有執行單擊操作,這是對操作進行設定
  4. perform:執行操作鏈中所有的操作,即之前預約的所有操作
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# move_to_element會將滑鼠指標放置在"設定"連結上,實現懸停效果
ActionChains(driver)\
    .move_to_element(
driver.find_element(By.XPATH, "//span[text()='設定']"))\
    .pause(3)\
    .perform()

ActionChains(driver)\
    .click(driver.find_element(By.LINK_TEXT, "搜尋設定"))\
    .pause(3)\
    .perform()

ActionChains(driver)\
    .click(driver.find_element(By.ID, "s1_2"))\
    .click(driver.find_element(By.ID, "SL_2"))\
    .click(driver.find_element(By.ID, "sh_1"))\
    .click(driver.find_element(By.LINK_TEXT, "儲存設定"))\
    .pause(3)\
    .perform()

注:

操作鏈中涉及的所有WebElement元素在操作鏈執行時必須同時存在,且處於可操作狀態,否則無法執行操作鏈。也就是說,在同一個操作鏈中,無法做到先操作某個元素,然後另一個新元素才顯示,接著再操作這個新元素。

6.對頁面視窗截圖

driver.save_screenshot(截圖檔案儲存路徑)

7.對元素截圖

driver.find_element(By.XPATH,"//*[text()='新聞']").screenshot(截圖儲存的路徑)