Python+Selenium处理Windows弹窗(非IE弹窗问题)

上一篇 / 下一篇  2016-10-18 14:15:49 / 个人分类:Selenium

1.背景:
对于上传保存的操作,selenium对于windows的控件窗口这种元素基本是没有办法,使用spy++工具以及引入python(pywin32)库可以弥补这个缺陷。


2.工具准备:(python+selenium自动测试环境)
(1)SPY++:查看窗口句柄工具
(2)pywin32库  (pywin32**win32gui、win32con、win32api)

3、使用方法:
(1)使用SPY++获取需要操作的窗口:
根据句柄找到对应的位置:

(2)根据spy++获取对应的位置:
分别使用print hex(pwin/pwin1/pwin2/pwin3/pwin4/pwin5)查看是否定位正确,若结果不是为0x00L,则正确
例如:
a = u'#32770'
pwin =win32gui.FindWindow(a,None)
pwin1=win32gui.FindWindowEx(pwin,None,'DUIViewWndClassName',None)
pwin2=win32gui.FindWindowEx(pwin1,None,'DirectUIHWND',None)
pwin3=win32gui.FindWindowEx(pwin2,None,'FloatNotifySink',None)
pwin4=win32gui.FindWindowEx(pwin3,None,'ComboBox',None)
pwin5=win32gui.FindWindowEx(pwin4,None,'Edit',None)

(3)获取窗口焦点
win32gui.SetForegroundWindow(pwin5)
 
(4)模仿键盘和鼠标进行操作:
win32api.keybd_event(13,0,0,0)     # Enter
win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0) #释放Enter按钮

四、实例:
#! /usr/bin/python
#coding=utf-8
import win32gui
import win32con
import win32api

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Firefox()
driver.maximize_window()
driver.get("https://www.baidu.com/")
time.sleep(3)
#定位到要右击的元素
page=driver.find_element_by_xpath(".//*[@id='u1']/a[1]")
#对定位到的元素执行鼠标右键操作
ActionChains(driver).context_click(page).perform()
page.send_keys("K")
time.sleep(3) #休眠3秒'''

#获取位置
a = u'#32770'
b = u'请输入要保存的文件名…'
#win32gui.FindWindow(a,None) 第一个参数为类名,第二个参数为标题
pwin =win32gui.FindWindow(a,b)

#pwin1=win32gui.FindWindowEx(pwin,None,'DUIViewWndClassName',None)
#层级,第三个参数为类名,第四个参数为标题
pwin1=win32gui.FindWindowEx(pwin,None,'DUIViewWndClassName',None)
pwin2=win32gui.FindWindowEx(pwin1,None,'DirectUIHWND',None)
pwin3=win32gui.FindWindowEx(pwin2,None,'FloatNotifySink',None)
pwin4=win32gui.FindWindowEx(pwin3,None,'ComboBox',None)
pwin5=win32gui.FindWindowEx(pwin4,None,'Edit',None)

'''
#------文件名保存为Test-----
#方法1: 通过keybd_event事件模拟键盘输入
win32gui.SetForegroundWindow(pwin5)
win32api.keybd_event(20,0,0,0) 
win32api.keybd_event(20,0,win32con.KEYEVENTF_KEYUP,0)
win32api.keybd_event(84,0,0,0) 
win32api.keybd_event(84,0,win32con.KEYEVENTF_KEYUP,0)
win32api.keybd_event(20,0,0,0) 
win32api.keybd_event(20,0,win32con.KEYEVENTF_KEYUP,0)
win32api.keybd_event(69,0,0,0)
win32api.keybd_event(69,0,win32con.KEYEVENTF_KEYUP,0)
win32api.keybd_event(83,0,0,0) 
win32api.keybd_event(83,0,win32con.KEYEVENTF_KEYUP,0)
win32api.keybd_event(84,0,0,0) 
win32api.keybd_event(84,0,win32con.KEYEVENTF_KEYUP,0)
win32api.keybd_event(1,0,0,0) 
win32api.keybd_event(1,0,win32con.KEYEVENTF_KEYUP,0)
time.sleep(1)
'''

#方法2:通过Windows的SendMessage函数消息发送快捷键
win32gui.SendMessage(pwin5, win32con.WM_SETTEXT, None, 'Test')
time.sleep(1)

#-----定位到取消按钮(确认键类似)------
b = u"取消"
cancel_button = win32gui.FindWindowEx(pwin, None,'Button',b)

#键盘聚焦点在“取消”按钮
'''
#--------按取消键--------
#方法1:
win32gui.SetForegroundWindow(cancel_button)
#按键盘Down键,操作“取消”按钮,激活
time.sleep(1)
win32api.keybd_event(40,0,0,0) 
win32api.keybd_event(40,0,win32con.KEYEVENTF_KEYUP,0)
time.sleep(1)
#按键盘ENTER键
win32api.keybd_event(13,0,0,0) 
win32api.keybd_event(13,0,win32con.KEYEVENTF_KEYUP,0)
'''

'''
#方法2:通过PostMessage的函数模拟按键

TAG: Windows

 

评分:0

我来说两句

日历

« 2024-04-25  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 21680
  • 日志数: 5
  • 建立时间: 2016-05-27
  • 更新时间: 2016-12-12

RSS订阅