Skip to main content
 首页 » 编程设计

Python,selenium webdriver之我需要基类方法来返回其子类的类型。如何实现

2024年11月01日33shihaiming

我是 Python(和 stackoverflow)的新手,我需要一些帮助。我有 2 个类如下

class baseClass(object):     
    def __init__(self): 
        self.attribute = None         
    def baseMethod(self): 
        return 'xxx' + str(self.attribute)     
class classA(baseClass): 
    field = "test"     
    def __init__(self): 
        self.attribute = "attribute value" 

我想做如下的事情:

objectA = classA() 
afterBaseMethod = objectA.baseMethod() 
afterBaseMethod.field 

但是我收到错误信息 AttributeError: 'str' 对象没有属性 'field'

事实上,我希望 baseMethod() 返回类型 objectA(所以我的子类类型)。 我怎样才能改变我的类定义来实现这一点?


抱歉,我做的不够精确。事实上,我想在 python 中实现页面对象以进行 webdriver 测试。我的代码如下。

from selenium import webdriver 
 
########## classes definitions 
class BasePageObject: 
 
    def __init__(self, driver): 
        self.locator = None 
        self.driver = driver 
    def getByLocator(self): 
        return self.driver.find_element_by_css_selector(self.locator) 
 
class MainPage(BasePageObject): 
    def __init__(self, driver): 
        self.driver = driver  
    def getHeader(self): 
        # I expect here to receive HeaderPageObject, not WebElement (as returned by getByLocator()) 
        return HeaderPageObject(self.driver).getByLocator()  
 
class HeaderPageObject(BasePageObject): 
    def __init__(self, driver): 
        self.driver = driver 
        self.locator = '#header' 
 
    def doSomethingWithHeader(self): 
        pass 
########################### 
driver = webdriver.Firefox() 
driver.get("https://www.linkedin.com") 
mainPage = MainPage(driver) 
header = mainPage.getHeader() 
header.doSomethingWithHeader() 

当我运行它时,我得到了 header.doSomethingWithHeader() AttributeError: 'WebElement' 对象没有属性 'doSomethingWithHeader'

请您参考如下方法:

您发布的代码只是定义了这两个类,这意味着您甚至没有告诉我们报告的错误发生在哪里或您做了什么来诱发它。但是 Python 的类机制完全可以胜任这项任务。

对象知道它们是什么类型,所以即使方法是从父类(super class)继承的,它也会在子类实例上运行(即 self 将是子类的实例).下面是一些代码来演示 - 两个类,每个类都使用基类来报告它们的类型:

class baseClass(object):     
    def baseMethod(self): 
        return type(self)     
 
class classA(baseClass): 
    pass 
 
b = baseClass() 
print b.baseMethod() 
 
a = classA() 
print a.baseMethod() 

哪些输出

<class '__main__.baseClass'> 
<class '__main__.classA'> 

您可以看到 classA 对象正确地打印出了它的类型,因此它知道发出调用的对象类型。我希望这能告诉您您需要了解的内容。