Как вызывать функции с именами, разделенными цифрами?Пример вызова функции от t1 до t20 - Python? - PullRequest
0 голосов
/ 23 октября 2018
def t17():
    Clientbox = 'body > table:nth-child(6) > tbody > tr > td:nth-child(2) > form 
    > table > tbody > tr:nth-child(1) > td:nth-child(1) > table > tbody > 
    tr:nth-child(7) > td:nth-child(3) > table > tbody > tr:nth-child(1) > 
    td:nth-child(2) > select'
    Clientname = driver.find_element_by_css_selector(Clientbox)
    Clientname.send_keys('Southern')

def t18():
    Clientbox = 'body > table:nth-child(6) > tbody > tr > td:nth-child(2) > form 
    > table > tbody > tr:nth-child(1) > td:nth-child(1) > table > tbody > 
    tr:nth-child(7) > td:nth-child(3) > table > tbody > tr:nth-child(1) > 
     td:nth-child(2) > select'
    Clientname = driver.find_element_by_css_selector(Clientbox)
    Clientname.send_keys('Star')



t3() Thenewway() InspectTickets() newticket() t4() Thenewway() InspectTickets() newticket() t5() Thenewway() I

nspectTickets()

Есть ли лучший способ сделать это?С петлей наверное.Новое в Pyhton.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Ответ Андраса Дика идеален.Я вкладываю свой ответ просто в надежде понять вашу проблему (и вопрос) еще лучше.Глядя на ваши функции, кажется, вам нужно, чтобы один элемент, полученный с помощью

driver.find_element_by_css_selector

, отправлял строку в текстовое поле

, если вам просто нужно отправить другую строку вОЧЕНЬ ЖЕ текстовое поле (мне кажется, что вы указываете на один и тот же элемент в двух примерах, которые вы прикрепили), тогда вам НЕ нужно использовать много функций, в точности как сказал Андрас.

просто используйтецикл for:

def t17():
    Clientbox = 'body > table:nth-child(6) > tbody > tr > td:nth-child(2) > form 
> table > tbody > tr:nth-child(1) > td:nth-child(1) > table > tbody > 
tr:nth-child(7) > td:nth-child(3) > table > tbody > tr:nth-child(1) > 
td:nth-child(2) > select'
    Clientname = driver.find_element_by_css_selector(Clientbox)
    # example list:
    key_list = ["Southern", "Star"]
    for key in key_list:
        Clientname.send_keys(key)

Конечно, если вам это нужно, не забудьте также отправить клавишу ВВОДА:

# this at top of the file:
from selenium.webdriver.common.keys import Keys
# in yout function:
Clientname.send_keys(Keys.ENTER))

И если вам нужно подождать перезагрузки страницы, затем также используйте метод Wait из библиотеки Selenium:

from selenium.webdriver.support import wait as Wait
from selenium.common.exceptions import TimeoutException

try:
    Wait(driver, 10).until(lambda driver: driver.find_element_by_css_selector(Clientbox).is_displayed())
except TimeoutException as e:
    print("here handle your exception", e)

Это будет ждать максимум 10 секунд (вы, конечно, можете настроить его!), затем он выдаст исключение TimeoutException, давая понять, что элементВы хотите (или даже всю страницу) не было загружено

Надеюсь, я понял смысл вашего вопроса, и это поможет.


Если вам абсолютно необходимо вызывать функции с помощьюномер (или выбранное имя), то выМожно попробовать использовать словарь, который предлагает больше контроля, чем список, если вам не нужно каждый раз зацикливать все перечисленные элементы:

def d1():
    return "it's d1"


def d2():
    return "it's d2"


def d3():
    return "it's d3"


def d4():
    return "it's d4"


def fun_switcher(num):
    switcher = {1: d1, 2: d2, 3: d3}
    return switcher.get(num, lambda: "fun address error")

# execution example:
if __name__ == "__main__":

    num = 2
    result = fun_switcher(num)
   # remember to call the function, or you will get the function_object as result!
    print(result())
0 голосов
/ 23 октября 2018

Очевидное решение состоит в том, чтобы не определять набор функций, а затем пытаться вызывать их по имени.Это та же проблема имен переменных: они приводят к не поддерживаемому коду.Практически всегда существуют более подходящие общие подходы, позволяющие использовать конструкции на естественном языке (перечисляемые переменные или функции не являются естественными).

Если вы настаиваете на наличии огромного количества функций (но вам следует реорганизовать код, чтобы избежатьэто), вы можете добавить все функции в список и вызывать их каждый:

all_funs = []

def foo(args):
    return 'hello'
all_funs.append(foo)

# ...
for fun in all_funs:
    # call the function in a loop
    print(fun())

Или я мог бы представить декоратор, который собирает функцию в контейнер для вас.

В любом случае вам придется проделать дополнительную работу, поскольку вы пытаетесь сделать что-то принудительное в python.В этом языке хорошо то, что простые вещи очень легко выполнять, поэтому, если вы видите, что выполняете много, казалось бы, ненужной работы, то вы, вероятно, выполняете ненужную работу.Сделайте несколько шагов назад и попробуйте переписать ваш код, чтобы он был более естественным.например, t17 и t18 отличаются только одной строкой, переданной в .send_keys.Вы должны сделать это входным параметром и использовать ту же функцию.Я уверен, что большинство из ваших 20 функций могут быть упрощены таким же образом, чтобы использовать одну или две базовые функции.

...