神秘的指令链(Action Chains)

有时候我们在通过Selenium做UI自动化的时候,明明能够在DOM树内看到这个元素,但是我在通过driver click、sendkey的时候,就是点击不到或无法输入字符串。实际上这是由于WEB中某些元素需要通过一系列连贯的操作才能处于可以点击的状态,driver提供的click方法是每次都只执行一个命令操作,而我们需要连贯的操作。或者经常遇到那种,需要鼠标悬浮后,要操作的元素才会出现的某种场景,那么我们就要模拟鼠标悬浮到某一个位置,做一系列的连贯操作,这里就要应用Selenium提供的ActionChains模块
下面我们就通过查看Selenium ActionChains的源码以及实例来讲解下鼠标悬操作的使用方法。

Selenium学习环境介绍

Selenium学习环境中基本覆盖了selenium学习过程中的所有实操内容,如Iframe、switch、alert、ActionChains等...

本文以下所有操作基于Selenium学习环境进行操作。

一、什么场景需要我们使用ActionChains模块

当我们需要连贯操作时,就需要用到ActionChains模块了。

例:以大师兄搭建的Selenium学习环境为例。(http://ui.imdsx.cn/uitester/

这种场景时,点击按钮实际是隐藏的,当我们鼠标悬浮在指定位置后,才会将点击按钮的display属性(css中隐藏属性)通过js操作删除掉,当鼠标移出指定位置后,js又会对其增加display属性。

这时如果你直接获取点击按钮的元素操作,一定是获取不到的,虽然说点击按钮确实存在于DOM树中,但是这个元素是不可见的。Selenium会报selenium.common.exceptions.ElementNotVisibleException: Message: element not visible。(元素不可见异常。)

当然我们也是可以通过Selenium提供的is_displayed来判断元素是否可见,就可以避免报错出现。

二、ActionChains模块的原理及源码分析

导入路径

from selenium.webdriver.common.action_chains import ActionChains

ActionChains的原理其实很简单,它实际就是将你要连贯操作的每个指令,追加到一个list中,通过调用一个启动方法,统一执行所有指令,这样就实现了连贯的操作。

ActionChains源码

这里ActionChains封装点睛之笔在于,它return本类,可以提供所谓的链式编程了,可以一直点到天荒地老,最后再加一个perform方法调用统一执行,在编写Code的时候就给予我们一种连贯的特征。个人认为非常的精髓。

三、ActionChains应用,连贯操作问题的落地解决。

我们既然知道ActionChains了的原理了那么我们来实际写一个例子验证下我们的分析。就以第一部分我们说到的http://ui.imdsx.cn/uitester/,为例。鼠标悬浮指定位置后,点击按钮,弹出ok的alert弹框。

import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://ui.imdsx.cn/uitester/')
time.sleep(2)
driver.execute_script('window.scrollTo(0,0)')
time.sleep(1)
a = driver.find_element_by_id('a')
dis = driver.find_element_by_id('dis1')
ActionChains(driver).move_to_element(a).click(dis).perform()

四、脚本中应用的Api方法介绍

 

posted @ 2018-03-08 23:35  尘世风  阅读(387)  评论(0)    收藏  举报
*/