Отсутствует выступление для селена ActionChains - PullRequest
0 голосов
/ 14 декабря 2018

Это очень распространенная и, иногда, трудно обнаружить проблему, когда «цепочки действий» определены, но фактически не применяются.Пример:

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

в противоположность:

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

ActionChains по существу ничего не будет делать и не будет выполнять никаких действий без perform().

Есть ли способ пойматьэтот тип проблемы рано со статическим анализом кода?


Я также посмотрел, предупредит ли PyCharm об этом, но он сообщает, что не обнаружен подозрительный код, который понятен, так как без вызова perform() это все еще совершенно допустимый Python.

Существует также это missing-perform правило ESLint .

1 Ответ

0 голосов
/ 17 декабря 2018

execute ()

execute () метод выполняет все сохраненные действия.

Согласно реализации ActionChains , perform() isкак и другой метод из класса ActionChains , например move_to_element(), click() и т. д.

Теперь класс ActionChains используется для автоматизации низкоуровневых взаимодействий, таких как мышьдвижения, действия кнопок мыши, нажатие клавиш и взаимодействия с контекстным меню, которые полезны для выполнения сложных действий, таких как наведение курсора и перетаскивание по цепочке метода .

Документация четко упоминает, чтобы генерироватьдействия пользователя, когда вы вызываете методы для действий над объектом ActionChains, эти действия сохраняются в очереди в объекте ActionChains .Наконец, когда вы вызываете perform(), события запускаются в том порядке, в котором они поставлены в очередь.

Итак, следуя этой логике, вы были совершенно правы, указав ... ActionChains по существуничего не делайте и не выполняйте никаких действий без perform() ... , и при статическом анализе кода невозможно отследить этот тип проблемы на раннем этапе.

Даже в IDE, например Eclipse, PyCharm или даже Sublime Text3 проприетарный кросс-платформенный редактор исходного кода с Python интерфейс прикладного программирования (API) не предупредит об этом.

В качестве примера Eclipse не будет жаловаться на пропавшее perfrom():

no_perform

Но Eclipse будет жаловаться на Bad Indentation :

bad_indentation

Эти случаи аналогичны классическому случаю IDE, которые не жалуются, когда Ожидаемые условия который должен вызываться с кортежем , и это не функция, а фактически класс, инициализатор которого ожидает только 1 аргумент за пределами неявного self :

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

Снимок среды IDE:

tuple

...