webdriver处理鼠标右键菜单栏

selenium中ActionChains类提供了鼠标操作的常用方法,但对于鼠标右键的菜单栏,无论是send_keys(Keys.ARROW_DOWN)还是send_keys("K")(注:前者是模拟键盘上的方向键,后者是通过字母以快捷方式打开)都显得无能为力

一个比较典型的例子是百度图片另存为:想要在百度图片里选择一张"笔记本电脑"的图片并另存为,上面两种方法都是做不到的

多次百度之后,发现有一篇文章解决了这个问题——WebDriver如何处理右键菜单》,文中提到win32api和win32con可以做这个事情,第一步是先引入:

import win32api
import win32con

引入之后,如果我们要对按键进行操作,就要模拟一次按下和释放的过程,比如现在要按下键盘上的字母V键,由于V在ASCII码表中的键码是86,可以写成以下形式

win32api.keybd_event(86,0,0,0)                         #字母V的键码是86
win32api.keybd_event(86,0,win32con.KEYEVENTF_KEYUP,0)  #按下后再释放

附上键位的ASCII码表

完整的访问百度图片,选择图片另存为的代码如下

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys     #需要引入keys包
import time
import win32api
import win32con

#初始化chromedriver
driver = webdriver.Chrome()

#打开百度首页
driver.get("http://www.baidu.com")

#浏览器窗口最大化
driver.maximize_window()

#等待2s
time.sleep(2)

#定位到百度首页的更多产品
more_xpath = "//a[@name='tj_briicon']"
more_element = driver.find_element_by_xpath(more_xpath)

#鼠标悬浮
ActionChains(driver).move_to_element(more_element).perform()
time.sleep(2)

#点击图片
img_element = driver.find_element_by_xpath("//a[@name='tj_img']").click()
time.sleep(2)

#定位百度图片输入框,并输入内容"笔记本电脑"
input_element = driver.find_element_by_id("kw")
input_element.send_keys("笔记本电脑")

#等待2s
time.sleep(2)

#回车
input_element.send_keys(Keys.ENTER)
time.sleep(2)

#定位到要右击的元素
pc_img_element = driver.find_element_by_xpath("//a[@name='pn1']")

#右键,打开右键菜单栏
ActionChains(driver).context_click(pc_img_element).perform()
time.sleep(2)

#点击V图片另存为:
#1. 按下键盘上的V键
win32api.keybd_event(86, 0, 0, 0)

#2. 释放键盘上的V键
win32api.keybd_event(86, 0, win32con.KEYEVENTF_KEYUP, 0)

感谢原文作者不断尝试,不断求索的精神,这种精神是一个良好的测试工程师必备的素质,而不求甚解,得过且过的态度是无法在技术上有所提升的。应当以前者为勉,以后者为鉴

参考文章

http://blog.sina.com.cn/s/blog_5042ea610102w928.html

猜你喜欢

转载自www.cnblogs.com/cnhkzyy/p/9248952.html
今日推荐