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

def waitForElement(self, elementName, expectedCondition, searchBy)

哪里:
elementName-我要查找的元素的名称。可以是id、name、xpath、css等等……
expectedCondition-这是设置硒预期条件的地方。所以可以是:元素可以点击,元素的可见性,等等…
上述函数在内部实现标准的SeleniumWebDriverWait如下:
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部分作为参数传递给函数?
希望我能很好地描述我的处境。如果我没有,我很乐意澄清。

最佳答案

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

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")

10-06 09:24