当定义但未实际应用“动作链”时,这是非常常见的,有时很难发现问题。例:
# 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 editor和Python application programming interface(API)的IDE也不会对此发出警告。
例如,Eclipse不会抱怨缺少的perfrom()
:
但是Eclipse会抱怨Bad Indentation:
这些情况类似于IDE的经典情况,当expected_conditions应该用一个元组调用时它不会抱怨,它不是一个函数,而是一个实际上是类的类,其初始化程序只期望隐式self之外的1个参数:
class element_to_be_clickable(object):
# .....
def __init__(self, locator):
# .....
IDE快照: