首页 > 解决方案 > 是否可以像这样返回值?

问题描述

我有一个关于 Python 语法的问题,在谷歌上没有找到:/
我试图编写通用函数,用于在 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 或 Link Text 等

是否可以返回这样的值?案例我在执行那部分代码时出错

标签: pythonseleniumxpathcss-selectors

解决方案


是否可以返回这样的值?案例我在执行那部分代码时出错

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

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

一个建议:您可以直接将选择器编写为这样的一对:

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

那么你根本不需要__unify_locator()

self.driver.find_elements(*selector)

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

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

然后使用**代替*

self.driver.find_elements(**selector)

最后,你不能elif没有if.,但我认为你只是没有在__unify_locator().


推荐阅读