硒ActionChains缺少执行

时间:2018-12-14 14:53:10

标签: python selenium selenium-webdriver static-analysis flake8

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

# 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

1 个答案:

答案 0 :(得分:1)

perform()

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()

no_perform

但是 Eclipse 会抱怨缩进

bad_indentation

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

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

IDE快照:

tuple