当定义但未实际应用“动作链”时,这是非常常见的,有时很难发现问题。示例:
# 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。
答案 0 :(得分:1)
perform()方法执行所有存储的操作。
根据ActionChains的实现,perform()
就像 ActionChains 类中的另一种方法,例如move_to_element()
,click()
等。 / p>
现在, ActionChains 类用于自动执行低级交互,例如鼠标移动,鼠标按钮操作,按键和上下文菜单交互,这对于执行复杂的操作(如悬停,拖动和拖动)非常有用通过方法链接删除。
文档中明确提到,要在调用ActionChains对象上的操作方法时生成用户操作,这些操作将存储在 ActionChains 对象中的队列中。最后,当您调用perform(
)时,事件将按照排队的顺序触发。
按照这种逻辑,您非常正确地指出 ...如果没有perform()
... ,ActionChains本质上将不执行任何操作,也不执行任何操作,并且没有办法通过静态代码分析尽早发现此类问题。
即使是IDE,例如 Eclipse , PyCharm 甚至是Sublime Text3 a proprietary cross-platform source code editor Python application programming interface(API)不会对此发出警告。
例如, Eclipse 不会抱怨缺少perfrom()
:
但是 Eclipse 会抱怨缩进:
这些情况类似于IDE的经典情况,当expected_conditions应该用 tuple 调用时,它不会抱怨,它不是函数,而是实际上是一个类,其初始化程序期望仅 1 个参数,而不是隐式的 self :
class element_to_be_clickable(object):
# .....
def __init__(self, locator):
# .....
IDE快照: