神秘的指令链(Action Chains)

转:http://www.imdsx.cn/index.php/2017/11/22/click/

最近有很多同学私聊问我,在通过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模块的原理及源码分析

导入路径

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

ActionChains源码


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

 

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

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


 

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


 

posted @ 2018-07-07 22:39  懒懒的妞  阅读(719)  评论(0编辑  收藏  举报