UI自动化(九)上传按钮

自动化中上传按钮一直是一个比较容易出变数的元素,按照类别分为两大类,分别是input类型与非input类型。

一、input类型上传按钮

input标签是可以直接send_keys的,这种情况下就简单粗暴。举例:

driver.find_element_by_id('file').send_keys('d:\\all_money.wmv') 

二、非input类型上传按钮

那么对于那些不是input框实现的上传怎么办,这种上传千奇百怪,有用a标签的,有用div的,有用button的,有用object的,我们没有办法通过直接在网页上处理掉这些上传,唯一的办法就是打开windows的系统弹框,去处理弹框。

问题又来了,Selenium2.0还不能解决掉windows系统弹框的问题,怎么办?很简单,用OS层面的操作去处理呗(谁家的孩子谁家领回家的思维方式在哪里都好用)

大体上有以下四种解决方案:

SendKeys库

Python pywin32库,识别对话框句柄,进而操作

autoIT,借助外力,我们去调用其生成的au3或exe文件。

win32api中的keybd_event模块,跟第二种类似,不过是模拟按键,ctrl+a,ctrl+c, ctrl+v…

1、 pywin32库

pywin32适用于windows,因为这个强大的库主要是提供访问windows的API。较为重要的三个模块分别是:win32api、win32gui和win32con。

相信如果各位尝试pip安装或者IDE安装,应该不会很顺利才对,主要是因为这个库太过强大,很多的脚本甚至病毒程序都有使用,所以国内不提供正常的安装方式,所以我利用下载的whl文件进行手动安装。

所以首先要下载pywin32的whl文件,下载链接:https://pypi.org/project/pywin32/#files,特别注意,需要下载对应python版本的whl文件,不然引用应该不成功。

下载完成之后,进行以下步骤。

1、以管理员身份运行cmd

2、执行命令:pip install wheel

3、cd至对应的whl文件目录

4、执行命令:pip install文件名

注:如果引用失败,则为环境问题,在设置中勾选“Inherit global site-packages”

引用的话就比较简单,以下为我个人编写的一个上传函数,仅供参考。

from timeimport sleep

import win32gui

import win32con


def upload(path, browser_type="chrome"):

    """

    通过pywin32模块实现文件上传的操作

    :param path: 文件的绝对路径

    :param browser_type: 浏览器类型(默认值为chrome)

    :return:

     """

    if browser_type.lower() =="chrome":

        title ="打开"

    elif browser_type.lower() =="firefox":

        title ="文件上传"

    elif browser_type.lower() =="ie":

        title ="选择要加载的文件"

    else:

        title =""

    # 一级窗口"#32770","打开"

    dialog = win32gui.FindWindow("#32770", title)

    # 向下传递

    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', "打开(&O)")

    # 输入文件的绝对路径,点击“打开”按钮

    win32gui.SendMessage(edit, win32con.WM_SETTEXT, None, path)

    sleep(1)

    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, button)

自行借鉴即可。

2、 AutoIT工具

除了python工具库,还可以使用外在工具来实现上传。

首先下载AutoIT,下载地址:https://www.autoitscript.com/site/autoit/

思路就是安装之后的话需要制作一个exe可执行文件,然后再用python中的os调用。

(1)创建一个au3文件,编辑脚本内容,通常只需要修改第三行的上传文件或者图片的路径即可

ControlFocus("打开","","Edit1"); 识别windows窗口,( "窗口标题", "窗口文本", 控件ID) 

WinWait("[CLASS:#32770]","",10); 窗口等待十秒,( "窗口标题" [, "窗口文本" [, 超时时间]] ) 

ControlSetText("打开", "", "Edit1", "f:\abc\xyz.txt"); 想输入框中输入需要上传的地址,( "窗口标题", "窗口文本", 控件ID, "新文本" ) 

Sleep(2000)

ControlClick("打开", "","Button1"); 点击[打开】按钮,( "窗口标题", "窗口文本", 控件ID [, 按钮] [, 点击次数]] )

(2)生成exe文件

(3)在python文件中调用

import os

os.system(r'生成的exe文件路径')

3、keybd_event 

Windows 提供了一个模拟键盘 API 函数 Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。Keybd_event()函数能触发一个按键事件,也就是说会产生一个 WM_KEYDOWN 或 WM_KEYUP 消息。

该函数原型为:keybd_event(bVk, bScan, dwFlags, dwExtraInfo)

第一个参数:虚拟键码(键盘键码对照表见附录);

第二个参数:硬件扫描码,一般设置为0即可;

第三个参数:函数操作的一个标志位,如果值为KEYEVENTF_EXTENDEDKEY则该键被按下,也可设置为0即可,如果值为KEYEVENTF_KEYUP则该按键被释放;

第四个参数:定义与击键相关的附加的32位值,一般设置为0即可。

简单示例如下:

import win32api

import win32con

win32api.keybd_event(13,0,0,0)     # enter

win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)  #释放按键

键盘键码自行查找即可。或者可以花点功夫进行封装,如下:

VK_CODE = {'backspace':0x08,

 'tab':0x09,

'clear':0x0C,

'enter':0x0D,

'shift':0x10,

'ctrl':0x11,

'alt':0x12,

'pause':0x13,

'caps_lock':0x14,

'esc':0x1B,

'spacebar':0x20,

'page_up':0x21,

'page_down':0x22,

'end':0x23,

'home':0x24,

'left_arrow':0x25,

'up_arrow':0x26,

'right_arrow':0x27,

'down_arrow':0x28,

'select':0x29,

'print':0x2A,

'execute':0x2B,

'print_screen':0x2C,

'ins':0x2D,

'del':0x2E,

'help':0x2F,

'0':0x30,

'1':0x31,

'2':0x32,

'3':0x33,

'4':0x34,

'5':0x35,

'6':0x36,

'7':0x37,

'8':0x38,

'9':0x39,

'a':0x41,

'b':0x42,

'c':0x43,

'd':0x44,

'e':0x45,

'f':0x46,

'g':0x47,

'h':0x48,

'i':0x49,

'j':0x4A,

'k':0x4B,

'l':0x4C,

'm':0x4D,

'n':0x4E,

'o':0x4F,

'p':0x50,

'q':0x51,

'r':0x52,

's':0x53,

't':0x54,

'u':0x55,

'v':0x56,

'w':0x57,

'x':0x58,

'y':0x59,

'z':0x5A,

'numpad_0':0x60,

'numpad_1':0x61,

'numpad_2':0x62,

'numpad_3':0x63,

'numpad_4':0x64,

'numpad_5':0x65,

'numpad_6':0x66,

'numpad_7':0x67,

'numpad_8':0x68,

'numpad_9':0x69,

'multiply_key':0x6A,

'add_key':0x6B,

'separator_key':0x6C,

'subtract_key':0x6D,

'decimal_key':0x6E,

'divide_key':0x6F,

'F1':0x70,

'F2':0x71,

'F3':0x72,

'F4':0x73,

'F5':0x74,

'F6':0x75,

'F7':0x76,

'F8':0x77,

'F9':0x78,

'F10':0x79,

'F11':0x7A,

'F12':0x7B,

'F13':0x7C,

'F14':0x7D,

'F15':0x7E,

'F16':0x7F,

'F17':0x80,

'F18':0x81,

'F19':0x82,

'F20':0x83,

'F21':0x84,

'F22':0x85,

'F23':0x86,

'F24':0x87,

'num_lock':0x90,

'scroll_lock':0x91,

'left_shift':0xA0,

'right_shift ':0xA1,

'left_control':0xA2,

'right_control':0xA3,

'left_menu':0xA4,

'right_menu':0xA5,

'browser_back':0xA6,

'browser_forward':0xA7,

'browser_refresh':0xA8,

'browser_stop':0xA9,

'browser_search':0xAA,

'browser_favorites':0xAB,

'browser_start_and_home':0xAC,

'volume_mute':0xAD,

'volume_Down':0xAE,

'volume_up':0xAF,

'next_track':0xB0,

'previous_track':0xB1,

'stop_media':0xB2,

'play/pause_media':0xB3,

'start_mail':0xB4,

'select_media':0xB5,

'start_application_1':0xB6,

'start_application_2':0xB7,

'attn_key':0xF6,

'crsel_key':0xF7,

'exsel_key':0xF8,

'play_key':0xFA,

'zoom_key':0xFB,

'clear_key':0xFE,

'+':0xBB,

',':0xBC,

'-':0xBD,

'.':0xBE,

'/':0xBF,

'`':0xC0,

';':0xBA,

'[':0xDB,

'\\':0xDC,

']':0xDD,

"'":0xDE,

'`':0xC0}


def typer(string=None,*args):

    for i in string:

        if i ==' ':

            win32api.keybd_event(VK_CODE['spacebar'],0,0,0)

            time.sleep(.05)

            win32api.keybd_event(VK_CODE['spacebar'],0,win32con.KEYEVENTF_KEYUP ,0)

        elif i =='!':

            win32api.keybd_event(VK_CODE['left_shift'],0,0,0)

            win32api.keybd_event(VK_CODE['1'],0,0,0)

            time.sleep(.05)

            win32api.keybd_event(VK_CODE['left_shift'],0,win32con.KEYEVENTF_KEYUP ,0)

            win32api.keybd_event(VK_CODE['1'],0,win32con.KEYEVENTF_KEYUP ,0)

        elif i =='@':

            win32api.keybd_event(VK_CODE['left_shift'],0,0,0)

            win32api.keybd_event(VK_CODE['2'],0,0,0)

            time.sleep(.05)

            win32api.keybd_event(VK_CODE['left_shift'],0,win32con.KEYEVENTF_KEYUP ,0)

            win32api.keybd_event(VK_CODE['2'],0,win32con.KEYEVENTF_KEYUP ,0)

        elif i =='{':

            win32api.keybd_event(VK_CODE['left_shift'],0,0,0)

            win32api.keybd_event(VK_CODE['['],0,0,0)

            time.sleep(.05)

            win32api.keybd_event(VK_CODE['left_shift'],0,win32con.KEYEVENTF_KEYUP ,0)

            win32api.keybd_event(VK_CODE['['],0,win32con.KEYEVENTF_KEYUP ,0)

        elif i =='?':

            win32api.keybd_event(VK_CODE['left_shift'],0,0,0)

            win32api.keybd_event(VK_CODE['/'],0,0,0)

            time.sleep(.05)

            win32api.keybd_event(VK_CODE['left_shift'],0,win32con.KEYEVENTF_KEYUP ,0)

            win32api.keybd_event(VK_CODE['/'],0,win32con.KEYEVENTF_KEYUP ,0)

只提供一个思路,剩下的自行补充。

你可能感兴趣的:(UI自动化(九)上传按钮)