Нужно уменьшить несколько других, если в Python - PullRequest
3 голосов
/ 18 марта 2019

Я пытаюсь автоматизировать регрессионное тестирование для базовых HTML-сайтов, используя selenium-webdriver, используя python.Я написал функцию, которая будет принимать входные данные из Excel, чтобы определить тип локатора элемента на веб-странице, который выглядит следующим образом:

            if locator_type == "ID":
                web_element = self.__driver.find_element_by_id(element)
            elif locator_type == "NAME":
                web_element = self.__driver.find_element_by_name(element)
            elif locator_type == "XPATH":
                web_element = self.__driver.find_element_by_xpath(element)
            elif locator_type == "TAG_NAME":
                web_element = self.__driver.find_element_by_tag_name(element)
            elif locator_type == "LINK_TEXT":
                web_element = self.__driver.find_element_by_link_text(element)
            elif locator_type == "CLASS_NAME":
                web_element = self.__driver.find_element_by_class_name(element)
            elif locator_type == "PARTIAL_LINK_TEXT":
                web_element = self.__driver.find_element_by_partial_link_text(element)

Это так, чтобы мы могли указать тип локатора и датьфактический локатор («элемент»), чтобы селен мог попытаться найти веб-элемент на веб-странице.Есть ли способ уменьшить утверждения elif или любой другой лучший способ написать эту часть?

Слишком много операторов if

Я попробовал метод по приведенной выше ссылке, но он мне не помог.Пожалуйста, помогите мне решить эту проблему.

РЕДАКТИРОВАТЬ Я попытался создать подобный диктованный

locator_dict = {
'ID' : driver.find_element_by_id(element),
'NAME' : driver.find_element_by_name(element)}

, тогда я получил сообщение о том, что элемент не определен

Ответы [ 2 ]

10 голосов
/ 18 марта 2019

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

d = {
    "ID": self.__driver.find_element_by_id,
    "NAME": self.__driver.find_element_by_name,
    # etc
}

if locator_type in d:
    web_element = d[locator_type](element)
else:
    # do something if you haven't defined a method for locator_type

Вы также можете использовать methodcaller, хотя с первой попытки d зависит от element:

from operator import methodcaller

methods = [
    ("ID", "find_element_by_id"),
    ("NAME", "find_element_by_name"),
    # etc
]
d = { tag: methodcaller(method, element) for tag, method in methods } 

if locator_type in d:
    web_element = d[locator_type](self.__driver)

Чтобы быть полностью независимым от драйвера или элемента, используйте

d = dict(methods)
if locator_type in d:
    web_element = methodcaller(d[locator_type], element)(self.__driver)
4 голосов
/ 18 марта 2019

Вы можете создать имя функции для вызова из locator_type, а затем вызвать ее:

locator_type_lower = locator_type.lower()

find_function_name = 'find_element_by_{}'.format(locator_type_lower)

driver_function_to_call = getattr(self.__driver, find_function_name)

web_element = driver_function_to_call(element)

Вам, вероятно, следует обернуть это в некоторую проверку ошибок - проверьте, существует ли функция, проверьте, вызывается ли она и т. Д.

Что это делает: преобразует тип locator_type в нижний регистр, затем создает, как мы надеемся, имя функции существующей функции в self .__ driver, а затем вызывает его с вашим элементом.

Этот метод имеет то преимущество, что вам не нужно отображать строки в функции - если self.__driver имеет функцию с именем find_element_by_foo_bar_length, то вы можете просто добавить FOO_BAR_LENGTH в свою таблицу Excel, и он будет вызван , нет необходимости обновлять ваш картографический диктат.

Редактировать: обновлено для комментариев

Чтобы перевести строку locator_type в атрибут класса By:

locator_type = 'ID'
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((getattr(By, locator_type), element)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...