闲逸笔记

keep it simple & stupid

Python + Selenium 做 Web UI 自动化测试时上传、下载文件对话框的操作

Selenium 是基于 JavaScript 的库,对于浏览器弹出的上传、下载文件对话框不支持。但在 Windows 操作系统中,可以通过 PyWin32 库操作对话框。

当然,对于 <input type="file" />控件,直接通过 send_keys() 即可上传。

1. 安装相关库

因为有 Windows 系统相关的交互,通过 PIP 难以安装。直接下载 exe 可执行程序进行安装。

2. 使用

# -*- coding: utf-8 -*-

import win32gui
import re
import SendKeys
import time

class WindowFinder:
    """Class to find and make focus on a particular Native OS dialog/Window """

    def __init__ (self):
        self._handle = None

    def find_window(self, class_name, window_name = None):
        """Pass a window class name & window name directly if known to get the window """
        self._handle = win32gui.FindWindow(class_name, window_name)

    def _window_enum_callback(self, hwnd, wildcard):
        '''Call back func which checks each open window and matches the name of window using reg ex'''
        if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None:
            self._handle = hwnd

    def find_window_wildcard(self, wildcard):
        """ This function takes a string as input and calls EnumWindows to enumerate through all open windows """

        self._handle = None
        win32gui.EnumWindows(self._window_enum_callback, wildcard)

    def set_foreground(self):
        """Get the focus on the desired open window"""
        win32gui.SetForegroundWindow(self._handle)

def send_keys_to_dialog(title=r".*Upload.*", key_valus=r""):
    win_dialog = WindowFinder()

    win_dialog.find_window_wildcard(title) 
    win_dialog.set_foreground()

    time.sleep(2)

    SendKeys.SendKeys(key_valus)
    SendKeys.SendKeys("{ENTER}")

if __name__ == "__main__":
    send_keys_to_dialog(u"Open", r"E:\documents\Selenium.docx")

传递两个参数:"对话框标题" 及 "文件路径",即可。

3. 参考资料


Permalink [http://sleepycat.org/blog/35]


评论区

 

fifth   2016-04-21 20:39  在此条评论下回复 ▼ 

怎么自动点击浏览器弹出来的下载框并下载文件啊用Python + Selenium+win32gui吗

Henry    Blog Author  2016-04-22 17:15

这个说实话不好操作。这个所谓的 Win32GUI 的库也不过是截取当时的活动窗口然后发送回车键,不很稳定。因为那个下载框在不同的浏览器、不同的操作系统上都是不一样的。最简单的办法是设置自动下载到指定目录。

 

 

ssliu   2014-10-31 17:04  在此条评论下回复 ▼ 

有QQ吗? 我想跟你详细请教下这个Python处理windows对话框的问题,拜托了!

Henry    Blog Author  2014-11-03 09:28

抱歉刚看到,公司屏蔽了 QQ,有问题可发邮件给我 skymatrix#126.com :)

 

发表评论

top bottom