2016-06-17 30 views
3

Ich habe vor kurzem zu einem neuen Projekt wechseln und alle unsere Selen-Tests sind in Python geschrieben. Ich frage mich, ob ich den Code Lautstärke mit Dekorateure reduzierenRefactoring mit Dekoratoren, um Code-Volumen zu reduzieren

, was wir jetzt bekommen ist:

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

Ich denke ich ist es eine Möglichkeit, dass die ganze self.find(self.view_button).click() in etwas zu minimieren, wie click.view_button

Ich hörte, dass es mit Dekorateuren gemacht werden könnte, aber als Java-Person hatte ich wenig Erfolg damit.

Antwort

2

funktioniert auch die folgende Lösung überprüfen; Erstellen Sie neue Modul - navigation.py mit:

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 

In basetestcase.py:

class BaseTestCase(unittest.TestCase, Navigation) 

     setUpClass(cls): 
     #somethign here 

und Ihren Testfall würde die folgende Art und Weise aussehen:

class TestSomething(BaseTestCase): 

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

     #create button 
     self.create_button.click 

Auf diese Weise werden Sie in der Lage sein, die Navigationsklasse in Ihrem Test zu verwenden. Außerdem halten Sie alle Navigationselemente an einem Ort

1

Ich bin mir nicht sicher, wie Sie es schaffen würden, so dass Sie click.view_button tun können. Sie können jedoch Element eine eigene Klasse zuweisen. Auf diese Weise können Sie etwas wie view_button.click() erreichen. In meinem Projekt mache ich das für alle meine Elemente.

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

Dank von RemcoW schreiben ich eine Lösung gefunden, siehe unten

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 

in Testfälle es wie diese Sie

class TestThign(BaseTestCase): 

    def test_00_something(self): 
     self.view.click