“包装硒”;“预期条件”;python

“包装硒”;“预期条件”;python,python,selenium,Python,Selenium,我正在尝试使用自定义函数创建自己的Selenium类,以便测试脚本在某些场景中变得更加直观和健壮,至少对我来说是这样。我当前的任务之一是包装所有Selenium预期条件(如上所述),以便最终生成一个类似以下内容的函数: def waitForElement(self, elementName, expectedCondition, searchBy) 其中: elementName-我要查找的元素的名称。可以是id、名称、xpath、css等 expectedCondition-这是设置Sel

我正在尝试使用自定义函数创建自己的Selenium类,以便测试脚本在某些场景中变得更加直观和健壮,至少对我来说是这样。我当前的任务之一是包装所有Selenium预期条件(如上所述),以便最终生成一个类似以下内容的函数:

def waitForElement(self, elementName, expectedCondition, searchBy)
其中:

elementName
-我要查找的元素的名称。可以是id、名称、xpath、css等

expectedCondition
-这是设置Selenium预期条件的地方。所以可以是:元素可点击,元素所在位置的可见性,等等

上述函数在内部实现标准Selenium
WebDriverWait
,如下所示:

try:
    if expectedCondition == "element_to_be_clickable":
        element = WebDriverWait(self.driver, defaultWait).until(EC.element_to_be_clickable((searchBy, elementName)))
    elif expectedCondition == "visibility_of_element_located":
        element = WebDriverWait(self.driver, defaultWait).until(EC.visibility_of_element_located((searchBy, elementName)))
一切都很好,但我在将
searchBy
作为参数传递时遇到了一些麻烦。要提醒您,
searchBy
可以是以下内容之一:

By.ID
By.NAME
By.CLASS_NAME
...
当我从主代码调用此包装器函数时,我使用以下行执行此操作:

self.waitForElement("elementName", "element_to_be_clickable", "By.NAME", "test")
因此,所有参数都作为字符串传递,除了
searchBy
部分之外,这对任何事情都适用

所以我的问题是:如何将
By.X
部分作为参数传递给函数?
希望我能很好地描述我的情况。如果我不是,我很乐意澄清。

你可以这样开始:

创建按实例接受的主findElement方法:

然后创建使用findElement方法的wait方法:

并通过实例传递给findElementAndWaitElementToPresent方法:


类似的事情是在我正在研究/使用的框架中完成的

最终,在提出问题后,我能够解决这个问题。因此,为了获得所需的功能,上述方法将如下所示:

def waitForElement(self, elementName, expectedCondition, searchBy):
    try:
        if expectedCondition == "element_to_be_clickable":
            element = WebDriverWait(self.driver, self.defaultWait).until(EC.element_to_be_clickable((getattr(By, searchBy), elementName)))
        elif expectedCondition == "visibility_of_element_located":
            element = WebDriverWait(self.driver, self.defaultWait).until(EC.visibility_of_element_located((getattr(By, searchBy), elementName)))

        . . . 
self.waitForElement("elementName", "element_to_be_clickable", "NAME")
所以可以这样称呼:

def waitForElement(self, elementName, expectedCondition, searchBy):
    try:
        if expectedCondition == "element_to_be_clickable":
            element = WebDriverWait(self.driver, self.defaultWait).until(EC.element_to_be_clickable((getattr(By, searchBy), elementName)))
        elif expectedCondition == "visibility_of_element_located":
            element = WebDriverWait(self.driver, self.defaultWait).until(EC.visibility_of_element_located((getattr(By, searchBy), elementName)))

        . . . 
self.waitForElement("elementName", "element_to_be_clickable", "NAME")

代码的问题是您正在将“By”数据类型转换为字符串

简单的方法是不加引号地传递它,如下所示:

self.waitForElement(“elementName”,“element可点击”,By.NAME,“test”)

您需要做的另一件事是在python模块中添加导入,如下所示,从中调用上述方法:


来自selenium.webdriver.common.by import by

您好,谢谢您的回答,但我想用Python提供一个解决方案。哦,对不起:)但是Python也有您可以使用的Webelement模块。我向您建议了一个如何实现它的结构
def waitForElement(self, elementName, expectedCondition, searchBy):
    try:
        if expectedCondition == "element_to_be_clickable":
            element = WebDriverWait(self.driver, self.defaultWait).until(EC.element_to_be_clickable((getattr(By, searchBy), elementName)))
        elif expectedCondition == "visibility_of_element_located":
            element = WebDriverWait(self.driver, self.defaultWait).until(EC.visibility_of_element_located((getattr(By, searchBy), elementName)))

        . . . 
self.waitForElement("elementName", "element_to_be_clickable", "NAME")