Selenium4+Python3系列(九) – 上传文件及滚动条操作

一、上传文件操作

上传文件是每个做自动化测试同学都会遇到,而且可以说是面试必考的问题,标准控件我们一般用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去控制滚动条的方法,有兴趣的同学可以自行尝试。

发表评论

相关文章