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)