Selenium4+Python3系列(九)

2022-11-26 21:01:11

一、上傳檔案操作

上傳檔案是每個做自動化測試同學都會遇到,而且可以說是面試必考的問題,標準控制元件我們一般用send_keys()就能完成上傳,
但是我們的測試網站的上傳控制元件一般為自己封裝的,用傳統的上傳已經不好用了, 也就是說用seleniumAPi已經無法完成上傳操作了。
那麼下面,針對控制元件進行分類進行演示:

1、標準控制元件

標準控制元件很簡單,直接用send_keys就能搞定,範例程式碼如下:

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
# 開啟上傳網站
driver.get("http://localhost:8080/upload.html")
# 觸發檔案上傳的操作
upload = driver.find_element(By.ID, "upload")
time.sleep(2)
# 1、輸入檔案路徑
filepath = f"e:\\demo.pdf"
upload.send_keys(filepath)

2、非標準控制元件

針對非標準控制元件,我們就要借用第三方手段來輔助完成上傳檔案的操作,比如鍵盤事件、Autoltwin32gui(與Autolt很像),這裡以win32gui為例來演示。

範例程式碼如下:

import time
import win32con
import win32gui
from pathlib import Path
from selenium import webdriver
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.maximize_window()
# 開啟上傳網站
driver.get("http://localhost:8080/upload.html")
paths = Path.cwd().parent
# 觸發檔案上傳的操作
upload = driver.find_element(By.ID, "upload")
actions = ActionChains(driver)
actions.click(upload).perform()
time.sleep(2)
# 一級頂層視窗
dialog = win32gui.FindWindow("#32770", "開啟")
# 二級視窗
comboBoxEx32 = win32gui.FindWindowEx(dialog, 0, "ComboBoxEx32", None)
# 三級視窗
comboBox = win32gui.FindWindowEx(comboBoxEx32, 0, "ComboBox", None)
# 四級視窗 -- 檔案路徑輸入區域
edit = win32gui.FindWindowEx(comboBox, 0, "Edit", None)
# 二級視窗 -- 開啟按鈕
button = win32gui.FindWindowEx(dialog, 0, "Button", None)
# 1、輸入檔案路徑
filepath = f"e:\\demo.pdf"
win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, filepath)
# 2、點選開啟按鈕
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)

二、卷軸操作

在寫指令碼時,總會遇到一種情況,就是當捲動拉倒最下面了,表單或者下拉框、按鈕這些元素未在當前頁面展示,而webdriver提供的方法都是操作當前頁面可見的元素,這時我們使用JavaScript操作瀏覽器的卷軸,捲動後使頁面元素可見,就可完成後面的元素操作了。

1、核心思路

就是使用js去控制瀏覽器卷軸的位置,在使用selenium呼叫JavaScript操作js完成。

下面舉例幾種常用卷軸的js程式碼範例如下:

//拖動卷軸至底部
document.documentElement.scrollTop=10000
window.scrollTo(0,document.body.scrollHeight)

//拖動卷軸至頂部
document.documentElement.scrollTop=0
arguments[0].scrollIntoView(false);

//左右方向的卷軸可以使用window.scrollTo(左邊距,上邊距)方法
window.scrollTo(200,1000)

2、實際案例

以部落格園我的文章列表頁為例,來演示卷軸操作,具體程式碼如下:

from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get("https://www.cnblogs.com/longronglang/")
driver.maximize_window()

# 獲取第一篇文章列表元素
element = driver.find_element(By.CSS_SELECTOR,".forFlow [role='article']:nth-of-type(1) .vertical-middle")
sleep(2)
# 將頁面卷軸拖到底部
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
# 將卷軸捲動至第三篇文章列表位置
driver.execute_script("arguments[0].scrollIntoView(true)", element)
sleep(2)
# 將卷軸捲動到頂部
driver.execute_script("arguments[0].scrollIntoView(false)", element)
sleep(2)
# 將卷軸捲動到指定位置
driver.execute_script("window.scrollTo(200,1000)")

以上為個人總結的一些關於卷軸操作的常用方法,更多關於js去控制卷軸的方法,有興趣的同學可以自行嘗試。