Selenium web自动化测试经验分享-上传文件之非input标签(二)

俗话说有一就有二,来分享下非input标签的上传多个文件的经验。原本以为,只是传入的值有变化(真是年轻不懂事啊),原没想到坑多得想放弃,比如频繁登录各网站后被限制弄得苦不堪言;比如PyUserInput前天用着好好的,昨儿死活不成功,郁闷半天;

大部分的代码我都试过两个情景:QQ空间更换头像【多个文件上传后,有明显提示】和百度网盘上传文件【多个文件上传 有显示;虽是input标签的,但是点击后 正常弹出窗口,当作非input标签来操作】

首先用图片来说明下 成功上传一个成功上传多个 到底有啥不同?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
个人体会是:

  1. 上传一个,Edit输入框 直接输入的是 某文件绝对路径 // 当前目录下的某文件
  2. 上传多个,Edit输入框 是 第一条基础上 + 每个文件必须加双引号

一)使用PyUserInput模块

之前就在第一次分享PyUserInput的时候 模拟键盘操作,推荐使用PyUserInput模块 就发现type_string()中文输入时有问题【但我没弄懂】,在我前一篇非input标签【上传单个文件】使用type_string()来直接输入文件路径,都是没问题的,但是在我模拟这次上传多个文件的时候,掉坑里了。

第一天输入的路径全部没问题,第二天输入的路径全部出现问题。明明想输入‘D:\45x45.JPG’,实际出现的却有汉字。郁闷一下午,下班后,突然明白了,是不是和输入法中英文输入有关系。没错!

以下代码是 QQ邮箱登录页 在账号一栏做的尝试:

# 输入法 英文输入时 只显示英文、数字,中文被忽略
# 中文输入,出现各种问题
k1.type_string('小米aichi打你迷你xiaomi123456xiaomi987oppo')
time.sleep(2)
dr.find_element_by_css_selector('#u').clear()
dr.find_element_by_css_selector('#u').click()

k1.type_string('xxx213xxxx23')
time.sleep(2)
dr.find_element_by_css_selector('#u').clear()
dr.find_element_by_css_selector('#u').click()

k1.type_string('12313213123')
time.sleep(2)
dr.find_element_by_css_selector('#u').clear()
dr.find_element_by_css_selector('#u').click()

k1.type_string('@#$%%^^^&&**(()))')
time.sleep(2)
dr.find_element_by_css_selector('#u').clear()
dr.find_element_by_css_selector('#u').click()

k1.type_string('[email protected]')
time.sleep(2)
dr.find_element_by_css_selector('#u').clear()
dr.find_element_by_css_selector('#u').click()

time.sleep(1)
# 使用shift切换输入法的中文 英文
k1.tap_key(k1.shift_l_key)

k1.type_string('xiaomi11op')
time.sleep(2)
k1.type_string('小米aichi打你迷你xiaomi123456xiaomi987oppo')
time.sleep(2)

来看下实际使用PyUserInput模块来处理QQ空间更换头像,一次上传多个图【绝对路径】:

# 顺序输入文件路径 成功 不必有空格!!!
k1 = pykeyboard.PyKeyboard()
k1.type_string(r'"D:\40x40.JPG"   ')      # 字符串有多个空格
time.sleep(2)
k1.type_string(r'"D:\25x25.JPG"')
time.sleep(2)
k1.tap_key(k1.space_key)        # 使用空格键
k1.type_string(r'"D:\45x45.JPG"')
time.sleep(2)
k1.type_string(r'"D:\35x35.JPG"')
time.sleep(2)       # 没加空格
k1.type_string(r'"D:\50x50.JPG"')
time.sleep(2)
k1.tap_key(k1.enter_key)
time.sleep(2)   # 实际不支持多图,可以看到有提示

在这里插入图片描述

# 循环输入列表中的文件路径 成功
l2 = ['"D:\\35x35.JPG"', '"D:\\45x45.JPG"', '"D:\\40x40.JPG"', '"D:\\50x50.JPG"', '"D:\\25x25.JPG"']
k2 = pykeyboard.PyKeyboard()
for l in l2:
    k2.type_string(l)
    k2.tap_key(k2.space_key)
    time.sleep(1)
time.sleep(2)
k2.tap_key(k2.enter_key)

在这里插入图片描述

# 直接输入 所有文件路径
k0 = pykeyboard.PyKeyboard()
lj1 = '"D:\\60x91.JPG""D:\\40x40.JPG" "D:\\50x50.JPG" "D:\\25x25.JPG" "D:\\35x35.JPG" "D:\\45x45.JPG"'
k0.type_string(lj1)
time.sleep(2)
k0.tap_key(k0.enter_key)

在这里插入图片描述
下面是百度网盘上传多个文件【相对路径】:

# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)
# 顺序输入文件路径 成功 默认是D盘 type_string()中文输入本来有问题,先把输入法换成英文默认
k1 = pykeyboard.PyKeyboard()
k1.type_string('D:')    # 不论默认位置,全部跳转到D盘

k1.tap_key(k1.enter_key)
time.sleep(1)
k1.type_string('"40x40.JPG"')
time.sleep(1)
k1.tap_key(k1.space_key)
k1.type_string('"25x25.JPG"')
time.sleep(1)
k1.tap_key(k1.space_key)
k1.type_string('"45x45.JPG"')
time.sleep(1)
k1.tap_key(k1.enter_key)
time.sleep(2)
# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)
# 直接输入 所有文件路径
k0 = pykeyboard.PyKeyboard()
k0.type_string('D:')
time.sleep(1)
k0.tap_key(k0.enter_key)
time.sleep(1)
lj1 = '"60x91.JPG""40x40.JPG""50x50.JPG""25x25.JPG""35x35.JPG"  "45x45.JPG"'
# 当前目录下的文件 有多个空格 有一个空格 没加空格
k0.type_string(lj1)
time.sleep(2)
k0.tap_key(k0.enter_key)
time.sleep(2)
# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)
# 循环输入列表中的文件路径 成功
l2 = ['"35x35.JPG"', '"45x45.JPG"', '"40x40.JPG"', '"50x50.JPG"', '"25x25.JPG"']
k2 = pykeyboard.PyKeyboard()
k2.type_string('D:')
time.sleep(1)
k2.tap_key(k2.enter_key)
time.sleep(1)

for l in l2:
    k2.type_string(l)
    time.sleep(1)

k2.tap_key(k2.enter_key)

二)模拟键盘操作

QQ空间更换头像,一次上传多个图【绝对路径】:

# 模拟键盘操作-QQ账号那一栏 复制 咱贴 成功
l3 = '"D:\\35x35.JPG" "D:\\45x45.JPG" "D:\\40x40.JPG" "D:\\25x25.JPG"'

dr.find_element_by_id('u').clear()
dr.find_element_by_id('u').send_keys(l3)
time.sleep(1)
k3 = pykeyboard.PyKeyboard()
k3.press_keys([k3.control_key, 'a'])
time.sleep(1)
k3.press_keys([k3.control_key, 'c'])
time.sleep(1)

...
...
...

k3.press_keys([k3.control_key, 'v'])
time.sleep(2)
k3.tap_key(k3.enter_key)
# 模拟键盘操作-循环输入列表中的文件路径-剪切 咱贴 成功
l4 = ['"D:\\35x35.JPG"', '"D:\\45x45.JPG"', '"D:\\40x40.JPG"', '"D:\\25x25.JPG"']
k4 = pykeyboard.PyKeyboard()
for l in l4:
    dr.find_element_by_id('u').send_keys(l)
    time.sleep(1)
    # dr.find_element_by_id('u').send_keys(Keys.SPACE)
    # time.sleep(1)

k4.press_keys([k4.control_key, 'a'])
time.sleep(1)
k4.press_keys([k4.control_key, 'x'])
time.sleep(1)

...
...
...

k4.press_keys([k4.control_key, 'v'])
time.sleep(2)
k4.tap_key(k4.enter_key)

下面是百度网盘上传多个文件【相对路径】:

# 模拟键盘操作-账号那一栏 复制 咱贴 成功
l3 = '"35x35.JPG" "45x45.JPG" "40x40.JPG" "25x25.JPG"'
k3 = pykeyboard.PyKeyboard()

driver.find_element_by_id('TANGRAM__PSP_4__userName').clear()
driver.find_element_by_id('TANGRAM__PSP_4__userName').send_keys(l3)
time.sleep(1)

k3.press_keys([k3.control_key, 'a'])
time.sleep(1)
k3.press_keys([k3.control_key, 'c'])
time.sleep(1)

...
...
...

# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)

k3.type_string('D:')
time.sleep(1)
k3.tap_key(k3.enter_key)
time.sleep(1)
k3.press_keys([k3.control_key, 'v'])
time.sleep(2)
k3.tap_key(k3.enter_key)
# 模拟键盘操作-循环输入列表中的文件路径-剪切 咱贴 成功
l4 = ['"35x35.JPG"', '"45x45.JPG"', '"40x40.JPG"', '"25x25.JPG"']
k4 = pykeyboard.PyKeyboard()
for l in l4:
    driver.find_element_by_id('TANGRAM__PSP_4__userName').send_keys(l)
    time.sleep(1)
    k4.tap_key(k4.space_key)
    time.sleep(1)

k4.press_keys([k4.control_key, 'a'])
time.sleep(1)
k4.press_keys([k4.control_key, 'x'])
time.sleep(1)

...
...
...

# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)

k4.type_string('D:')
time.sleep(1)
k4.tap_key(k4.enter_key)
time.sleep(1)
k4.press_keys([k4.control_key, 'v'])
time.sleep(2)
k4.tap_key(k4.enter_key)
time.sleep(2)

三)使用pywin32 库

QQ空间更换头像,一次上传多个图【绝对路径】:

# pywin32 成功
dialog = win32gui.FindWindow('#32770', '文件上传')
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
Button = win32gui.FindWindow('Button', '打开(&O)')
l5 = '"D:\\60x91.JPG" "D:\\40x40.JPG" "D:\\50x50.JPG" "D:\\25x25.JPG" "D:\\35x35.JPG" "D:\\45x45.JPG"'

win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l5)      # 别写错 发送路径的是Edit
time.sleep(2)
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)

QQ空间更换头像,一次上传多个图【相对路径】:

# pywin32 D盘 相对路径
dialog = win32gui.FindWindow('#32770', '文件上传')
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
Button = win32gui.FindWindow('Button', '打开(&O)')
l5 = 'D:'

win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l5)      # 别写错 发送路径的是Edit
time.sleep(2)
k5 = pykeyboard.PyKeyboard()
k5.tap_key(k5.enter_key)
time.sleep(2)

l6 = '"45x45.JPG""35x35.JPG""25x25.JPG"'
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l6)
time.sleep(2)

win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)
time.sleep(2)

下面是百度网盘上传多个文件【绝对路径】:

# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)
# pywin32 绝对路径 成功
dialog = win32gui.FindWindow('#32770', '打开')    # 谷歌浏览器
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
Button = win32gui.FindWindow('Button', '打开(&O)')
l5 = '"D:\\60x91.JPG" "D:\\40x40.JPG" "D:\\50x50.JPG" "D:\\25x25.JPG" "D:\\35x35.JPG" "D:\\45x45.JPG"'

win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l5)      # 别写错 发送路径的是Edit
time.sleep(2)
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)
time.sleep(2)

下面是百度网盘上传多个文件【相对路径】:

# 虽然上传是input标签,但是点击后还是弹出窗口,模拟非input标签
driver.find_element_by_id('h5Input0').click()
time.sleep(2)
# pywin32 D盘 相对路径
dialog = win32gui.FindWindow('#32770', '打开')
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
Button = win32gui.FindWindow('Button', '打开(&O)')
l5 = 'D:'

win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l5)      # 别写错 发送路径的是Edit
time.sleep(2)
k5 = pykeyboard.PyKeyboard()
k5.tap_key(k5.enter_key)
time.sleep(2)

l6 = '"45x45.JPG""35x35.JPG""25x25.JPG"'
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l6)
time.sleep(2)

win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)
time.sleep(2)

循环 列表中的文件路径 来实现上传多个文件:【百度网盘web界面 提示 网页过期,但上传是正常的】

# 循环输入列表中的文件路径 成功
l7 = ["D:\\60x91.JPG", "D:\\40x40.JPG", "D:\\50x50.JPG", "D:\\25x25.JPG", "D:\\35x35.JPG", "D:\\45x45.JPG"]
for l in l7:
    driver.find_element_by_id('h5Input0').click()
    time.sleep(2)
    dialog = win32gui.FindWindow('#32770', '打开')
    ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
    ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
    Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
    Button = win32gui.FindWindow('Button', '打开(&O)')
    win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l)      # 别写错 发送路径的是Edit
    time.sleep(2)
    win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)
    time.sleep(2)

四)利用AutoIt 工具实现

QQ空间更换头像,一次上传多个图【AutoIt脚本 写全部文件的绝对路径】:
在这里插入图片描述

# AutoIt 写完整的文件路径 成功
# 在AutoIt脚本中,文件路径是不需要转义的;不同浏览器的弹窗title不同;注意标点格式
os.system(r'D:\test\TestScripts\3_duo.exe')
time.sleep(2)

QQ空间更换头像,一次上传多个图【AutoIt脚本 写全部文件的相对路径】:

在这里插入图片描述

# AutoIt D盘 写相对路径 成功
os.system(r'D:\test\TestScripts\5_canshuhua.exe')
time.sleep(2)

QQ空间更换头像,一次上传多个图【Python脚本 写全部文件的绝对路径】:

在这里插入图片描述

# l6 = r'" ""D:\40x40.JPG"" ""D:\50x50.JPG"" ""D:\25x25.JPG"" ""D:\35x35.JPG"" ""D:\45x45.JPG"" "'  # 对的!!!
l6 = '" ""D:\\40x40.JPG"" ""D:\\50x50.JPG"" ""D:\\25x25.JPG"" ""D:\\35x35.JPG"" ""D:\\45x45.JPG"" "'  # 对的!!!


os.system('D:\\test\TestScripts\\4_canshuhua.exe %s' % l6)      # 成功 单str 多个文件
time.sleep(5)

QQ空间更换头像,一次上传多个图【Python脚本 写全部文件的相对路径】:

在这里插入图片描述

l7 = '" ""40x40.JPG"" ""50x50.JPG"" ""25x25.JPG"" ""35x35.JPG"" "'
os.system('D:\\test\TestScripts\\6_2canshu.exe %s %s' % ("D:", l7))
time.sleep(5)

百度网盘上传文件,一次上传多个【AutoIt脚本 写全部文件的绝对路径】:
在这里插入图片描述

# AutoIt 写完整的文件路径 成功
os.system(r'D:\test\TestScripts\3_chrome.exe')

百度网盘上传文件,一次上传多个【AutoIt脚本 写全部文件的相对路径】:

在这里插入图片描述

# AutoIt D盘 写相对路径 成功
os.system(r'D:\test\TestScripts\4_ch.exe')
time.sleep(2)

百度网盘上传文件,一次上传多个【Python脚本 写全部文件的绝对路径】:

在这里插入图片描述

l8 = '" ""D:\\60x91.JPG"" ""D:\\40x40.JPG"" ""D:\\50x50.JPG"" ""D:\\25x25.JPG"" "'
os.system('D:\\test\TestScripts\\4_chrome.exe %s' % l8)      # 成功 单str 多个文件

百度网盘上传文件,一次上传多个【Python脚本 写全部文件的相对路径】:

在这里插入图片描述

l9 = '" ""40x40.JPG"" ""50x50.JPG"" ""25x25.JPG"" ""35x35.JPG"" "'
os.system('D:\\test\TestScripts\\7_2canshu.exe %s %s' % ("D:", l9))

循环 列表中的文件路径来实现上传多个文件:【百度网盘web界面 提示 网页过期,但上传是正常的】
在这里插入图片描述

# 循环 上传文件
l10 = ["D:\\60x91.JPG", "D:\\40x40.JPG", "D:\\50x50.JPG", "D:\\25x25.JPG", "D:\\35x35.JPG", "D:\\45x45.JPG"]
for l in l10:
    driver.find_element_by_id('h5Input0').click()
    time.sleep(2)
    os.system('D:\\test\TestScripts\\4_chrome.exe %s' % l)
    time.sleep(1)

些许弯路

下面的操作 不见得是错的!

下面代码是 上传结果是最后一此输入的;也可以更改最后上传的F盘的某一图片为某一组图片,但是绕。

# pywin32 每次都更改,最后的一个输入被上传
dialog = win32gui.FindWindow('#32770', '文件上传')
ComboBoxEx32 = win32gui.FindWindowEx(dialog, 0, 'ComboBoxEx32', None)
ComboBox = win32gui.FindWindowEx(ComboBoxEx32, 0, 'ComboBox', None)
Edit = win32gui.FindWindowEx(ComboBox, 0, 'Edit', None)
Button = win32gui.FindWindow('Button', '打开(&O)')
l5 = 'D:'

win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l5)      # 别写错 发送路径的是Edit
time.sleep(2)
# k5 = pykeyboard.PyKeyboard()
# k5.tap_key(k5.enter_key)
# time.sleep(2)

l6 = '"45x45.JPG""35x35.JPG""25x25.JPG"'
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l6)
time.sleep(2)

l7 = 'F:\\21x26.JPG'
win32gui.SendMessage(Edit, win32con.WM_SETTEXT, 0, l7)
time.sleep(2)
win32gui.SendMessage(dialog, win32con.WM_COMMAND, 1, Button)
time.sleep(2)

下面脚本是 我想把每个文件路径先后 分别传给窗口,但是实际结果是前面的文件路径被后面代替,最后只传送了最后那个文件。
在这里插入图片描述
Selenium上传文件系列分享终结。

交流技术 欢迎+QQ 153132336 zy
个人博客 https://blog.csdn.net/zyooooxie

发布了78 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zyooooxie/article/details/88190633