在学习selenium自动化测试中,遇到文件上传,书的作者轻轻跳过,回避了实际工作要求。
本着从实际出发的想法,在网上查了些资料,最终使用win32库完成文件上传。
安装pypiwin32库: pip install pypiwin32
参考https://www.cnblogs.com/linuxchao/p/linuxchao-selenium-upload_file.html
===============================================================
回归正题,下面的内容是实操代码,希望注释能把事情描述的更清楚些。
import win32con
import win32gui
from time import sleep
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
def uploadFile(browser:str,file:str):
# 浏览器打开的窗口 标题名称有区别
browser_type = {
‘firefox‘:‘文件上传‘,
‘chrome‘:‘打开‘,
‘ie‘:‘选择要加载的文件‘
}
sleep(2)
# 使用工具WinSpy,定位“打开”窗口,class是 #32770
dialog = win32gui.FindWindow(‘#32770‘,browser_type[browser])
# 需要一级一级找子窗口edit;;;在工具WinSpy右侧可以看到“打开”窗口的结构:#32770 “打开”---ComboBoxEx32---ComboBox---Edit
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)
win32gui.SendMessage(edit,win32con.WM_SETTEXT,None,file)
win32gui.SendMessage(dialog,win32con.WM_COMMAND,1,button)
if __name__ == ‘__main__‘:
driver = webdriver.Chrome()
driver.get(r‘C:\Users\Administrator\PycharmProjects\webAutoTest\upload_file.html‘)
element = driver.find_element_by_xpath(‘//*[@id="upload_file"]‘)
action = ActionChains(driver)
action.move_to_element(element).click().perform()
action.release()
sleep(3)
uploadFile(‘chrome‘,r‘C:\driver\chromedriver 64b.exe‘)
sleep(3)
driver.quit()