zoukankan      html  css  js  c++  java
  • 实现无人工干预的自动上传附件(四)

    使用第三方工具Spy++,实现文件上传

    Spy++简介:

    Spy++ (SPYXX.EXE) 是一个基于 Win32 的实用工具,它提供系统的进程、线程、窗口和窗口消息的图形视图。使用 Spy++ 可以执行下列操作: 显示系统对象(包括进程、线程和窗口)之间关系的图形树。 搜索指定的窗口、线程、进程或消息。 查看选定的窗口、线程、进程或消息的属性。

    Spy++工具的使用说明

    打开浏览器上传窗口,使用Spy++工具的查找窗口功能,定位并获取窗口对象,如下图所示,刷新Spy++窗口,以查看获取的对话框窗口,对话框窗口以“窗口句柄+窗口标题+类名”命名,展开图形树,可查看所有子窗口句柄(包括加载文件的文本框和“打开”按钮),然后通过操作窗口的类名获取类对象,进行上传脚本编写。

        

    使用Spy++上传文件的操作原理:

    1. 获取上传文件的对话框

    2. 获取对话框中输入框Edit对象的句柄,用于加载上传文件绝对路径

    3. 获取对话框中的“打开”按钮句柄,用于上传文件

    目的:实现操作有一些webdriver无法操作的文件上传对象。

    用于测试的HTML代码:

    <html>
        <head>
            <title>上传文件</title>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        </head>
        <body>
            <form enctype="multipart/form-data" action="parse_file.jsp" method="post">
                <p>Browse for a file to upload: </p>
                <input id="file" name="file" type="file">
                <br>
                <br>
                <input id="filesubmit" value="SUBMIT" type="submit">
            </form>
        </body>
    </html>

    实战代码:

    #encoding=utf-8
    from selenium import webdriver
    import unittest,time,traceback
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.common.exceptions import TimeoutException, NoSuchElementException
    import win32gui,win32con
    
    class TestDemo(unittest.TestCase):
    
        def setUp(self):
            # 启动浏览器
            self.driver = webdriver.Ie(executable_path = "d:\IEDriverServer")
        def test_uploadFileByAutoIt(self):
            url = "http://127.0.0.1/test_upload_file.html"
            # 访问自定义网页
            self.driver.get(url)
            try:
                # 创建一个显示等待对象
                wait = WebDriverWait(self.driver, 10, 0.2)
                # 显示等待判断被测试页面上的上传文件按钮是否处于可被点击状态
                wait.until(EC.element_to_be_clickable((By.ID, 'file')))
            except TimeoutException, e:
                # 捕获TimeoutException异常
                print traceback.print_exc()
            except NoSuchElementException, e:
                # 捕获NoSuchElementException异常
                print traceback.print_exc()
            except Exception, e:
                # 捕获其他异常
                print traceback.print_exc()
            else:
                # 查找页面上ID属性值为“file”的文件上传框,
                # 并点击调出选择文件上传框
                self.driver.find_element_by_id("file").click()
                time.sleep(2)
                #通过Spy++工具实现文件上传
                #获取对话框窗口,注意,使用不同的浏览器操作,窗口标题可能不一样,需要根据实际访问的浏览器类型修改
                # dialogFirefox = win32gui.FindWindow('#32770', u'文件上传')
                # dialogChrome = win32gui.FindWindow('#32770', u'打开')
                dialogIe = win32gui.FindWindow('#32770', u'选择要加载的文件')
                # 下面三句通过图形树依次查找句柄类,直到找到输入框Edit类对象的句柄
                ComboBoxEx32 = win32gui.FindWindowEx(dialogIe, 0, 'ComboBoxEx32', None)
                ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
                Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
                # 获取“打开”按钮对象句柄
                button = win32gui.FindWindowEx(dialogIe, 0, 'Button', None)
                time.sleep(2)
                # 往输入框输入文件的绝对路径
                win32gui.SendMessage(Edit, win32con.WM_SETTEXT, None, 'e:\c.jpg')
                #模拟窗口点击”打开“按钮操作
                win32gui.SendMessage(dialogIe, win32con.WM_COMMAND, 1, button)
                time.sleep(4)
                # 找到页面上ID属性值为“filesubmit”的文件提交按钮对象
                fileSubmitButton = self.driver.find_element_by_id("filesubmit")
                # 单击提交按钮,完成文件上传操作
                fileSubmitButton.click()
                # 因为文件上传需要时间,所以这里可以添加显示等待场景,判断文件上传成功后,页面是否跳转到文件上传成功的页面。
                # 通过EC.title_is()方法判断跳转后的页面的Title值是否符合期望,如果匹配将继续执行后续代码
                #wait.until(EC.title_is(u"文件上传成功"))
                time.sleep(2)
        def tearDown(self):
            # 退出浏览器
            self.driver.quit()
    
    if __name__ == '__main__':
        unittest.main()
  • 相关阅读:
    命令执行顺序控制与管道
    js获取返回首页
    手机站点击商务通无轨迹解决方法
    js文字向上滚动代码
    文字隐藏多余的文字
    QQ弹窗代码
    百度推送代码
    js手机站跳转
    js 判断时间,满足执行框架
    js切换换class
  • 原文地址:https://www.cnblogs.com/ssj0723/p/9199125.html
Copyright © 2011-2022 走看看