2016-06-17 68 views
3

我最近切換到一個新項目,所有的硒測試都是用Python編寫的。我想知道如果我可以用裝飾使用裝飾器重構以減少代碼量

減少代碼量我們得到現在的問題是:

class BasePage(object): 
    view_button = ".//a[text()='View']" 
    create_button = ".//a[text()='Create']" 
    #some code here 

class BaseTestCase(unittest.TestCase): 
    setUpclass(cls): 
    #code here 

    def find(cls,xpath): 
     return cls.driver.find_element_by_xpath(xpath) 


class SomeTest(BaseTestCase): 
    def test_00_something(self): 
     self.find(self.view_button).click() 

我想是有辦法,以儘量減少整個self.find(self.view_button).click()成類似click.view_button

我聽說可以使用裝飾器完成,但作爲一個Java人,我沒有成功。

回答

2

還可以檢查以下解決方案;創建新的模塊 - 與navigation.py:

class Button(): 

    def __init__(self,driver, locator): 
     self.driver = driver 
     self.locator = locator 

    @property 
    def click(self): 
     return self.driver.find_element_by_xpath(self.locator).click() 

class Navigation(): 

    """NAVIGATION COMMANDS """ 
    def goTo(self): 
     #somethign 

    def previousPage(self): 
     #something 

    """ BUTTONS """ 
    @property 
    def view_button(self): 
     xpath = ".//a[text()='View']" 
     view = Button(self.driver,xpath) 
     return view 

    @property 
    def create_button(self): 
     xpath = ".//a[text()='Create']" 
     create = Button(self.driver,xpath) 
     return create 

在basetestcase.py:

class BaseTestCase(unittest.TestCase, Navigation) 

     setUpClass(cls): 
     #somethign here 

和測試用例看起來方式如下:

class TestSomething(BaseTestCase): 

    def test_99_somethign(self): 
     #finds .//a[text()='View'] and clicks 
     self.view.click 

     #create button 
     self.create_button.click 

這種方式,你會能夠在測試中使用導航類。另外,您可以將所有導航元素保存在一個地方

1

我不確定你會怎麼做,所以你可以做click.view_button。但是,你可以給你的元素自己的類。這樣你可以實現類似view_button.click()。在我的項目中,我爲我的所有元素都這樣做。

class BaseElement: 
    def __init__(self, driver, locator): 
     self.driver = driver 
     self.locator = locator 

    def get(self): 
     self.driver.find_element(locator) 

    def click(): 
     self.get().click() 


class ViewButton(BaseElement): 
    def __init__(self, driver): 
     locator = (By.XPATH, ".//a[text()='View']") 
     super(ViewButton, self).__init__(driver, locator) 


class BasePage(object): 
    def __init__(self, driver): 
     self.view_button = ViewButton(driver) 


class BaseTestCase(unittest.TestCase): 
    setUpclass(cls): 
     # driver stuff 
     self.page = BasePage(driver) 


class SomeTest(BaseTestCase): 
    def test_00_something(self): 
     self.page.view_button.click() 
1

由於從RemcoW後我找到了解決辦法,請參見下面

class ViewButton(): 

    def __init__(self,driver): 
     self.driver = driver 
     self.locator = (".//a[text()='View']") 

    @property 
    def click(self): 
     return self.driver.find_element_by_xpath(self.locator).click() 

class BaseTestCase(unittest.TestCase): 
    #some code here 

    @property 
    def view(self): 
     view = ViewButton(self.driver) 
     return view 

在測試情況下,它是這樣工作的

class TestThign(BaseTestCase): 

    def test_00_something(self): 
     self.view.click