codyc4321
codyc4321

Reputation: 9672

adding dynamic functions to class; Python

"""pip install selenium"""

import os, time, subprocess, random

from functools import wraps

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.select import Select


class WebdriverChauffuer(object):

    def __init__(self, username=None, password=None, start_url=None):
        self.username = username
        self.password = password
        self.start_url = start_url

    def quit(self):
        self.driver.quit()

    def restart_driver(self):
        self.driver.quit()
        self.start_driver()

    def get(self, url):
        self.driver.get(url)

    def maximize_window(self):
        self.driver.maximize_window()



class FirefoxDriver(WebdriverChauffuer):

    def __init__(self, username=None, password=None, start_url=None, driver=None):
        super(FirefoxDriver, self).__init__(username=username, password=password, start_url=start_url)
        self.start_driver()

    def start_driver(self):
        self.driver = webdriver.Firefox()

The goal is to have

class WebdriverChauffuer(object):

    def __init__(self, username=None, password=None, start_url=None):
        self.username = username
        self.password = password
        self.start_url = start_url

    def quit(self):
        self.driver.quit()

    def restart_driver(self):
        self.driver.quit()
        self.start_driver()

    def generate_methods(self):
        funcs = ['get', 'maximize_window']
        # makes get and maximize_window

then you can do

In [14]: d = FirefoxDriver()

In [15]: d.get('google.com')

In [16]: d.maximize_window()

This was promising but didn't work Python dynamic function creation with custom names

class Driver(object):
    pass


class FuncTester(object):

    def __init__(self):
        self.driver = Driver()
        self.generate_instance_methods()

    def make_method(self, name):
        def _method(self):
            getattr(self.driver, name)(*args, **kwargs)
        return _method

    def generate_instance_methods(self):
        FUNCTIONS = ['get', 'maximize_window']
        for name in FUNCTIONS:
            _method = self.make_method(name)
            setattr(self, name, _method)



In [11]: f = FuncTester()

In [12]: f.driver
f.driver

In [12]: f.driver.
  File "<ipython-input-12-9e167ce57f62>", line 1
    f.driver.
             ^
SyntaxError: invalid syntax


In [13]: f.driver.get
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-13-7e99453babae> in <module>()
----> 1 f.driver.get

AttributeError: 'Driver' object has no attribute 'get'

Upvotes: 1

Views: 215

Answers (1)

Morgan G
Morgan G

Reputation: 3109

Why don't you just pass the Selenium Driver object to your FuncTester like this:

class FuncTester(webdriver)

I am not 100% sure that would work and am not at a computer with selenium installed, but I think that would work. Just pass FuncTester the webdriver object.

Then when you do:

f = new FuncTester()

Try:

f.get()

I would however be careful not to override Selenium Webdriver functions with your own like you would be if you left,

FUNCTIONS = ['get', 'maximize_window']

In your code.

Then for something like this:

def restart_driver(self):
    self.driver.quit()
    self.start_driver()

just do:

def restart_driver(self):
    self.quit() //This got changed!
    self.start_driver()

Upvotes: 1

Related Questions