Reputation: 9672
"""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
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