1
"""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'
Community
  • 1
  • 1
codyc4321
  • 9,014
  • 22
  • 92
  • 165

1 Answers1

1

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()
Morgan G
  • 3,089
  • 4
  • 18
  • 26
  • I'll test tomorrow, ty. My friend said the problem is I'm not updating the namespace (this is a class, and most answers I've seen just generate the functions). There was an answer about updating namespace that was complicated but readable, from googling declare function dynamically python. I'll check tomorrow and update – codyc4321 Mar 03 '16 at 06:40
  • Ok! Let me know if it works, I can't think of much else atm because it is late, but I think just implementing webdriver in your class should do it. – Morgan G Mar 03 '16 at 06:44