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)

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容