可以这样返回值吗?

2024-06-09 16:19:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于Python语法的问题,没有在google上找到:/
我试图写一个通用函数,用于在Selenium上搜索定位器

我在locators.py中有定位器,它们看起来像这样:

class LoginForm:
    email    = {'css': '#email'}
    password = {'css': ' #password'}
    login_button = {'css': '#submitLoginForm'}

在base_page.py中,我有:

def __unify_locator(self,selector: dict):
    elif 'css' in selector.keys():
        return (By.CSS_SELECTOR,selector['css'])

def __element(self, selector: dict, index: int):
    return self.driver.find_elements((self.__unify_locator(selector)))[index]

如您所见,我试图从__unify_locator返回类似(By.CSS_SELECTOR,selector['css'])的内容。我想让它变得灵活,因为将来我可以使用XPath、链接文本或e.t.c

是否可以像这样返回值?如果我在执行那部分代码时出错


Tags: pyselfbyreturnemaildefpasswordselector
2条回答

Is it possible to return values like this ? case I got errors on execute that part of code

是的,您可以像这样返回一个元组。错误不是因为返回,而是因为您如何使用它。要将元组中的值作为参数分离到另一个函数,请使用splat运算符*

self.driver.find_elements(*self.__unify_locator(selector))
                          ^ here

一个建议:您可以直接将选择器成对写入:

email = (By.CSS_SELECTOR, '#email')

那么您根本不需要__unify_locator()

self.driver.find_elements(*selector)

或者,您的选择器可以是dict,为每个值的含义提供上下文:

email = {
    'by': By.CSS_SELECTOR,
    'value': '#email',
}

然后使用**代替*

self.driver.find_elements(**selector)

最后,没有if就不能有elif,但我认为您只是没有在__unify_locator()中发布一些代码

您的问题很可能只是使用了elif而不是if。我不知道你的其他设置,但如果你这样做,它可能会工作

if 'css' in selector.keys():

而不是使用elif

elif是else if的缩写。它位于不同的if语句之后,并且只有在前一个if条件的计算结果为false时才会被检查。因为这里只测试一个条件,所以应该使用if

既然您说您希望将来具有灵活性,那么您的下一个条件可以使用elif,并且如果它们的条件为true,则输入该条件,如果上面的条件为false,则输入该条件

相关问题 更多 >