在上面的实例中,一些交互动作都是针对某个节点执行的。比如,对于输入框,我们就调用它的输入文字和清空文字方法;对于按钮,就调用它的点击方法。其实,还有另外一些操作,它们没有特定的执行对象,比如鼠标拖曳、键盘按键等,这些动作用另一种方式来执行,那就是动作链。
1 """行为链""" 2 3 from selenium import webdriver 4 from selenium.webdriver.common.action_chains import ActionChains 5 6 driver_path = r"D:installchromedriverchromedriver.exe" 7 driver = webdriver.Chrome(executable_path = driver_path) 8 driver.get('https://www.baidu.com/') 9 10 intputTag = driver.find_element_by_id('kw') 11 submitBtn = driver.find_element_by_id('su') 12 13 actions = ActionChains(driver) 14 actions.move_to_element(intputTag) 15 actions.send_keys_to_element(intputTag, 'python') 16 actions.move_to_element(submitBtn) 17 actions.click(submitBtn) 18 actions.perform()
比如,现在实现一个节点的拖曳操作,将某个节点从一处拖曳到另外一处,可以这样实现:
from selenium import webdriver from selenium.webdriver import ActionChains from time import sleep # 创建一个浏览器对象 bro = webdriver.Chrome(executable_path="chromedriver.exe") # 发起url请求 bro.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable") # 定位的标签是存在于iframe的子页面中,如果直接使用find做定位,是定位不到的 # 定位iframe中标签操作 # 第一步:定位到iframe标签位置 bro.switch_to.frame("iframeResult") # 第二步:通过ID定位到需要拖动的标签 target_ele = bro.find_element_by_id("draggable") # 创建一个拖动对象 action = ActionChains(bro) # 点击拖动对象并长按保持 action.click_and_hold(target_ele) # 模拟拖动5次,每次拖动17个像素点 for i in range(5): # 执行拖动动作 action.move_by_offset(17, 0).perform() # 每拖动17像素暂停5秒 sleep(2) # 释放拖动对象句柄 action.release() sleep(2) # 关闭浏览器 bro.quit()