Оператор моржа Python 3.8 с not и назначением нескольких переменных

Я работаю над селеновой оберткой. Я хочу проверить, отображается ли элемент на веб-странице. Функция получает входную переменную selector который следует шаблону "selector=value" так например "id=content" но также может быть это "link_text=Hello World". Функция поиска разделяет эту строку на две части для поиска фактического элемента и возвращает его для использования при обработке ошибок. В сообщении об исключении должны быть указаны как селектор, так и значение:

      class KeywordFailed(Exception):
    
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)

class ElementFoundButNotVisible(KeywordFailed):
    def __init__(self, element, selector):
        super().__init__("element: \"" + element + "\" with selector: \"" + selector + "\" is not visible")

class DefaultKeywords:

    browser = webdriver.Firefox()

    def selectElement(self, selector):
        selectorValue = selector.split("=")[1]
        selector = selector.split("=")[0]
        try:
            if selector == "id":
                element = self.browser.find_element_by_id(selectorValue)
            elif selector == "xpath":
                element = self.browser.find_element_by_xpath(selectorValue)
            elif selector == "link_text":
                element = self.browser.find_element_by_link_text(selectorValue)
            elif selector == "partial_link_text":
                element = self.browser.find_element_by_partial_link_text(selectorValue)
            elif selector == "name":
                element = self.browser.find_element_by_name(selectorValue)
            elif selector == "class_name":
                element = self.browser.find_element_by_class_name(selectorValue)
            elif selector == "css_selector":
                element = self.browser.find_element_by_css_selector(selectorValue)
            elif selector == "tag":
                element = self.browser.find_element_by_tag_name(selectorValue)
        except NoSuchElementException:
            raise ElementNotFound(selectorValue, selector)
        else:
            return element, selector

    def findAndCheckIfVisible(self, selector):
        if (value, selector) := not self.selectElement(selector).is_displayed():
            raise ElementFoundButNotVisible(element, selector)
...

Хотя при выполнении я получаю следующую ошибку:

      SyntaxError: cannot use assignment expressions with tuple

Я мог бы переместить процесс разделения в отдельную функцию и просто назвать его одним в исключении и в функции поиска, но я действительно не хочу этого делать, так как это будет означать, что я выполняю один и тот же код дважды.

1 ответ

Вы не можете использовать форму распаковки с выражениями присваивания. Вместо этого рассмотрите возможность использования выражения присваивания для создания имени возвращаемого кортежа, а затем распаковку имени из выражения:

      def findAndCheckIfVisible(self, selector):
   if not (result:=self.selectElement(selector).is_displayed()):
      raise ElementFoundButNotVisible(element, selector)
   value, selector = result

Кроме того, вместо явных условных обозначений для каждого типа селектора рассмотрите возможность использования getattr:

      try:
   element = getattr(self.browser, f'find_element_by_{selector}')(selectorValue)
except NoSuchElementException:
   pass
Другие вопросы по тегам