当定义但未实际应用“动作链”时,这是非常常见的,有时很难发现问题。例:

# incorrect
ActionChains(driver).move_to_element(some_element).click(some_element)


相对于:

# correct
ActionChains(driver).move_to_element(some_element).click(some_element).perform()
                                                                       ^^^^^^^^^


如果没有perform(),ActionChains实际上将什么也不做,也不执行任何操作。

有没有一种方法可以通过静态代码分析及早发现这种类型的问题?



我还查看了PyCharm是否会对此发出警告,但是它没有报告发现可疑代码,这是可以理解的,因为没有perform()调用它仍然是一个完全有效的Python。

也有这个missing-perform ESLint rule

最佳答案

perform()

perform()方法执行所有存储的操作。

按照ActionChains的实现,perform()就像ActionChains类中的另一个方法,例如move_to_element()click()等。

现在,ActionChains类用于自动化低级交互,例如鼠标移动,鼠标按钮操作,按键和上下文菜单交互,这对于执行复杂的操作(如悬停和拖放方法链)非常有用。

该文档明确提到,要在调用ActionChains对象上的操作方法时生成用户操作,这些操作将存储在ActionChains对象的队列中。最后,当您调用perform()时,将按照事件排队的顺序触发事件。

因此,按照这种逻辑,您非常正确地指出了……如果没有perform(),ActionChains本质上将不执行任何操作,也不执行任何操作...,并且无法通过静态代码分析及早发现这种类型的问题。

即使是IDE,例如Eclipse,PyCharm或什至Sublime Text3 proprietary cross-platform source code editorPython application programming interface(API)的IDE也不会对此发出警告。

例如,Eclipse不会抱怨缺少的perfrom()

python -  Selenium ActionChains缺少执行-LMLPHP

但是Eclipse会抱怨Bad Indentation:

python -  Selenium ActionChains缺少执行-LMLPHP

这些情况类似于IDE的经典情况,当expected_conditions应该用一个元组调用时它不会抱怨,它不是一个函数,而是一个实际上是类的类,其初始化程序只期望隐式self之外的1个参数:

class element_to_be_clickable(object):
    # .....
    def __init__(self, locator):
        # .....


IDE快照:

python -  Selenium ActionChains缺少执行-LMLPHP

08-03 17:04